0

grepコマンドを使用するか、regex>"と"<"の文字の間に次の文字列を取得する方法を知りたいです。

ストリング :

<f id=mos-title>demo-break-1</f>

帰りたい

demo-break-1
4

3 に答える 3

0

次のような適切なxmlドキュメントがある場合:

<root>
  <f id="mos-title">demo-break-1</f>
</root>

適切なパーサーを使用できます。

xmllint --xpath "/root/f[@id='mos-title']" input.xml | \
      sed 's/[^>]*>\([^<]*\)<[^>]*>/\1\n/g'

あなたが持っている入力で、あなたはあなたがsedを使うことができる入力フォーマットが一貫している(すなわち、生成されている)ことを確信しています:

sed 's/[^>]*>\([^<]*\)<[^>]*>/\1/g' input
于 2013-03-15T00:36:39.900 に答える
0

通常は XML パーサーを使用するのが最善ですが、次の awk を試すこともできます。

awk '$1==s{print $2}' s="f id=mos-title" RS=\< FS=\> file
于 2013-03-16T11:56:35.817 に答える
0

ファイルfooに次が含まれているとします。

<f id=mos-title>demo-break-1</f>
<f id=mos-title>demo-break-2</f>
<f id=mos-title>demo-break-3</f>
<a>foo testing</a>

次のようなことができます。

perl -ne 'print "$1\n" if /<.+id=mos-title>(.+?)<\/f>/' foo

これらの一致が 1 行でのみ発生するという点で、これは厳密であることに注意してください。また、これは有効な HTML パーサーではないため、形式の偏差を考慮する必要があります。

これは、厳密である限りはよりリラックスしたアプローチですが、それでも 100% HTML に準拠しているわけではありません。

perl -ne 'print "$1\n" if /<.+id=mos-title\b.*?>\s*(.+?)\s*<\/f>/' foo

出力は次のようになります。

demo-break-1
demo-break-2
demo-break-3
于 2013-03-15T00:08:22.800 に答える