1

HTMLページ(特にユーザー名)で何かをgrepしようとするときに、次のように言って文字列を取得しようとするというこの問題が発生しています。

egrep -o dir\=\"[ltr]*\"\>.*(\<\/span|\<\/a)

これにより、「dir=("ltr or rlt")> の後、最初のタグ</a>または</span>終了タグの前に何かを取得します。

たとえば、次のようになります。

dir="ltr">myusername</span>

また

dir="rtl">myusername</a>

ただし、1 行に複数の span タグがあり、最初のタグの後に停止しないため、不要なデータが生成されます。

最初の正規表現の後に停止するように現在の正規表現を変更する方法はありますか? そして、なぜ読み続けるのでしょうか?

ありがとう

4

2 に答える 2

2

.*a を追加して、貪欲でないものにする必要があります?

egrep -o dir\=\"[ltr]*\"\>.*?(\<\/span|\<\/a)

より良い解決策はこれです(生の正規表現では、エスケープする必要があります):

dir="[ltr]{3}"[^>]*?>(.*?)(</span>|</a>)

キャプチャ グループ 1 ($1) にはその間にあるものが含まれ、キャプチャ グループ 2 ($2) にはスパンまたはリンク ターミネーションが含まれます。

実際に見てみましょう: http://regexr.com?32b8k

于 2012-10-03T02:14:11.490 に答える
0

私はGNU sedこれを行うために使用します:

sed -r 's/(dir="ltr"|dir="rtl")>([^<]+)(<\/span>|<\/a>).*/\2/' file.txt

単純化することで、正規表現をもう少し賢く、読みやすくすることができます。

sed -r 's/dir="(ltr|rtl)">([^<]+)<\/(span|a)>.*/\2/' file.txt
于 2012-10-03T03:55:14.977 に答える