1

一致したテキストの部分文字列のみを抽出するにはどうすればよいですか。

複数行の XML ファイルがあります。しかし、これは私が懸念していることです。

<url>/localhost/index.html</url>

私は試した

cat file.txt | grep -o '<url>.*</url>' 

それは私に全行を与えました。/localhost/index.html印刷されたいだけです。私がPythonで知っているように、正規表現をサブグループにグループ化し、印刷したいものを選ぶことができる他のオプションはありますか?

4

3 に答える 3

6

あなたgrepがサポートしていない場合-Pruakhの回答を参照)、それsedを行うために使用できます:

sed -n 's|.*<url>\(.*\)</url>.*|\1|p'
于 2013-05-24T23:41:42.957 に答える
2

私は使用しますsed

sed -n 's%.*<url>\(.*\)</url>.*%\1%p'

この-nオプションは、デフォルトの印刷をオフにします。置換コマンドは、1 行の<url></url>タグに一致し、その間にあるものをキャプチャして、先頭と末尾の要素を一致に含めます。交換はキャプチャされた素材であり、p手段は印刷されます。が正規表現に表示されるため、代わりに%inを使用しました。別の方法は、スラッシュを使用し、バックスラッシュで正規表現のスラッシュをエスケープすることです。s%%%s////

Perl も実行可能でシンプルです。

perl -n -e 'print if s%.*<url>(.*)</url>.*%\1%'

-nデフォルトでは印刷されないことを除いて、REPL を作成します。これprintは、代替操作が代替を行う場合にのみトリガーされます。

そして、このやや洗練された Perl スクリプトは<url>...</url>、1 行の複数のエントリを正しく処理します。

perl -n -e 'print "$1\n" while (s%.*?<url>(.*?)</url>%%)'

貪欲でない正規表現 ( .*?) を使用して、大量の情報を消費しないようにします。置換操作はオプションの前のゴミを検出して削除<url>...</url>しますが、コードは URL マーカー間の一致部分とそれに続く改行を出力します。

与えられたデータ:

xyz <url>/localhost/index1.html</url> pqr
xyz <url>/localhost/index2.html</url> abc <url>/localhost/index3.html</url> pqr
<url>/localhost/index4.html</url>
<url>/localhost/index5.html</url><url>/localhost/index6.html</url>
xyz <url>/localhost/index7.html</url> abc <url>/localhost/index3.html</url> xyz <url>/localhost/index9.html</url> abc <url>/localhost/index0.html</url> pqr

最後の Perl スクリプトは以下を生成します。

/localhost/index1.html
/localhost/index2.html
/localhost/index3.html
/localhost/index4.html
/localhost/index5.html
/localhost/index6.html
/localhost/index7.html
/localhost/index3.html
/localhost/index9.html
/localhost/index0.html
于 2013-05-24T23:46:52.470 に答える
2

のバージョンがフラグ (Perl 互換の正規表現用)をgrepサポートしている場合は、 lookaroundを使用できます。-P

grep -Po '(?<=<url>).*(?=</url>)' file.txt
于 2013-05-24T23:38:40.603 に答える