grep
コマンドを使用するか、regex
>"と"<"の文字の間に次の文字列を取得する方法を知りたいです。
ストリング :
<f id=mos-title>demo-break-1</f>
帰りたい
demo-break-1
次のような適切な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
通常は XML パーサーを使用するのが最善ですが、次の awk を試すこともできます。
awk '$1==s{print $2}' s="f id=mos-title" RS=\< FS=\> file
ファイル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