web-dev-qa-db-ja.com

UnixコマンドラインからXMLタグを削除するにはどうすればよいですか?

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つのコマンドで実行したいと思います

19
Tarski

ファイルがそのように見える場合は、sedが役立ちます。

sed -e 's/<[^>]*>//g' file.xml

もちろん XMLの解析に正規表現を使用しないでください難しいため

36
Johnsyweb

Awkの使用:

awk '{gsub(/<[^>]*>/,"")};1' file.xml
4
dogbane

使用する html2textコマンドラインツール。htmlをプレーンテキストに変換します。

または、 ex -way:を試すこともできます。

ex -s +'%s/<[^>].\{-}>//ge' +%p +q! file.txt

または:

cat file.txt | ex -s +'%s/<[^>].\{-}>//ge' +%p +q! /dev/stdin
1
kenorb

これを試してみてください:

grep -Po '<.*?>\K.*?(?=<.*?>)' inputfile

説明:

Perl互換の正規表現の使用(-P)そして指定された一致のみを出力します(-o):

  • <.*?>-山かっこ内の文字の貪欲でない一致
  • \K-前の一致を出力に含めないでください(一致の開始をリセットします-ポジティブルックビハインドに似ていますが、可変長の一致で機能します)
  • .*?-次の試合で停止する欲張りでない試合(この部分が出力されます)
  • (?=<.*?>)-山かっこ内の文字の貪欲でない一致であり、出力に一致が含まれていません(正の先読み-可変長の一致で機能します)
1

これは「perlgolfコンテスト」ではないことは知っていますが、以前はこのトリックを使用していました。

<または>にレコードセパレータを設定し、奇数行のみを印刷します。

awk -vRS='<|>' NR%2 file.xml
0
SielaQ