XMLファイルをgrepしているので、次のような出力が得られます。
<tag>data</tag>
<tag>more data</tag>
...
これはフラットファイルであり、XMLツリーではないことに注意してください。 XMLタグを削除し、その間にデータを表示したい。私はこれをすべてコマンドラインから実行していて、awkに2回パイプするよりも良い方法があるかどうか疑問に思っていました...
cat file.xml | awk -F'>' '{print $2}' | awk -F'<' '{print $1}'
理想的には、これを1つのコマンドで実行したいと思います
Awkの使用:
awk '{gsub(/<[^>]*>/,"")};1' file.xml
使用する html2text
コマンドラインツール。htmlをプレーンテキストに変換します。
または、 ex -way:を試すこともできます。
ex -s +'%s/<[^>].\{-}>//ge' +%p +q! file.txt
または:
cat file.txt | ex -s +'%s/<[^>].\{-}>//ge' +%p +q! /dev/stdin
これを試してみてください:
grep -Po '<.*?>\K.*?(?=<.*?>)' inputfile
説明:
Perl互換の正規表現の使用(-P
)そして指定された一致のみを出力します(-o
):
<.*?>
-山かっこ内の文字の貪欲でない一致\K
-前の一致を出力に含めないでください(一致の開始をリセットします-ポジティブルックビハインドに似ていますが、可変長の一致で機能します).*?
-次の試合で停止する欲張りでない試合(この部分が出力されます)(?=<.*?>)
-山かっこ内の文字の貪欲でない一致であり、出力に一致が含まれていません(正の先読み-可変長の一致で機能します)これは「perlgolfコンテスト」ではないことは知っていますが、以前はこのトリックを使用していました。
<
または>
にレコードセパレータを設定し、奇数行のみを印刷します。
awk -vRS='<|>' NR%2 file.xml