2017-08-25 14 views
0

私は、以下のように多くの行を含むファイルを持っている:特殊文字のAwkの/ GSUBの代替と列抽出

<li><img src="img/tt_potato-30x30.png" alt="ew_inactive"> <img src="img/in-event-40x40.png" alt="event"> - dep[(0:0)(0:0)]ref[(3:0)(0:0)]srch[?] - <a href "tcc_1111.html">XX:The quick brown fox jumped over the lazy </a> -<img src= "img/config-40x40.png" alt="config"><img src="img/validate-40x50.png" alt="validate"> - user 

<li><img src="img/tt_potato-30x30.png" alt="ew_inactive"> <img src="img/in-event-40x40.png" alt="event"> - dep[(0:0)(0:0)]ref[(3:0)(0:0)]srch[?] - <a href "tcc_1111.html">YY:Jack and Jill went up the hill </a> -<img src= "img/config-40x40.png" alt="config"><img src="img/validate-40x50.png" alt="validate"> - user 

<li><img src="img/tt_potato-30x30.png" alt="ew_inactive"> <img src="img/in-event-40x40.png" alt="event"> - dep[(0:0)(0:0)]ref[(3:0)(0:0)]srch[?] - <a href "tcc_1111.html">ZZ: Mary had a little lamb </a> -<img src= "img/config-40x40.png" alt="config"><img src="img/validate-40x50.png" alt="validate"> - user 

私は、以下の文字列を抽出し、他のすべてを破棄したいです。

XX: The quick brown fox jumped over the lazy 
YY: Jack and Jill went up the hill 
ZZ: Mary had a little lamb 

は、これまでのところ私は、次のawkコマンドを使用してみましたが、XXはYYとZZのために交換する必要があるとして、限られているように見えます。

awk '{gsub(/^.*XX:/,"XX:"); gsub(/[<\a>].*$/,"[</a>].");print}' 

他の標準的なLinuxツールを使用して提案できる代替品はありますか?おかげさまで

+0

XX/YY/ZZは一般的にどのようにする必要がありますか?それがあればほとんどの正規表現エンジンで '[XYZ] {2}'を実行できます。 – stevesliva

+0

@stevesliva、私は問題はより多くの(またはまた)OPは正規表現で一致する文字に応じて置換文字列を変更する必要があると思う。 – jas

+0

こんにちは、Jasは正しいですが、 ':'の前に文字列を置き換えるバリエーションがあります..あなたの返信をありがとう – niknak

答えて

0

^.XXany character followed by XX at the start of a lineを意味 - それはXXミッドラインとは一致しません。 [<\a>]any of the characters <, \, a, or >を意味します。文字列は<\a>と一致しません。正規表現のチュートリアルを見つける...

あなたの質問は明確ではありませんが、これはあなたがやろうとしていることでしょうか?間で何でも印刷するには()と一致するように、第三引数のための

$ awk '{sub(/<\/a>.*/,""); sub(/.*>/,"")} NF' file 
XX:The quick brown fox jumped over the lazy 
YY:Jack and Jill went up the hill 
ZZ: Mary had a little lamb 

またはGNU AWKとの...(1行に1つずつと仮定):いずれかのsed

$ awk 'match($0,/.*<a[^>]*>(.*)<\/a>.*/,a){print a[1]}' file 
XX:The quick brown fox jumped over the lazy 
YY:Jack and Jill went up the hill 
ZZ: Mary had a little lamb 

は次のようになります。

$ sed -n 's/.*<a[^>]*>\(.*\)<\/a>.*/\1/p' file 
XX:The quick brown fox jumped over the lazy 
YY:Jack and Jill went up the hill 
ZZ: Mary had a little lamb 
0

私は推測する、このperlのワンライナーを行うだろう(あなたがLinux上であるように見える):

perl -lne 'print $1 if m{>((XX|YY|ZZ):[^<]*)}' 
+0

すべての返信をお寄せいただきありがとうございます。大いに感謝します – niknak

1

Input_fileが上記の例と同じ場合は、次も同じように役立ちます。

awk -F"\">|</a>" 'NF{print $4}' Input_file 

説明:フィールドセパレータとして"></a>を作る(明らかに:) OPが必要なものを取得します)。 NFは空行をスキップする必要があります。ここでフィールドセパレータをこれらの2つに設定すると、第4フィールドがOPが必要とするフィールドになることがわかります。ここではフィールドの値をすべて表示する方法と、OPが取得する必要がある4番目のカラムを選択できます。

awk -F"\">|</a>" '{for(i=1;i<=NF;i++){print i,$i}}' Input_file 
1 <li><img src="img/tt_potato-30x30.png" alt="ew_inactive 
2 <img src="img/in-event-40x40.png" alt="event 
3 - dep[(0:0)(0:0)]ref[(3:0)(0:0)]srch[?] - <a href "tcc_1111.html 
4 XX:The quick brown fox jumped over the lazy 
5 -<img src= "img/config-40x40.png" alt="config 
6 <img src="img/validate-40x50.png" alt="validate 
7 - user 
1 <li><img src="img/tt_potato-30x30.png" alt="ew_inactive 
2 <img src="img/in-event-40x40.png" alt="event 
3 - dep[(0:0)(0:0)]ref[(3:0)(0:0)]srch[?] - <a href "tcc_1111.html 
4 YY:Jack and Jill went up the hill 
5 -<img src= "img/config-40x40.png" alt="config 
6 <img src="img/validate-40x50.png" alt="validate 
7 - user 
1 <li><img src="img/tt_potato-30x30.png" alt="ew_inactive 
2 <img src="img/in-event-40x40.png" alt="event 
3 - dep[(0:0)(0:0)]ref[(3:0)(0:0)]srch[?] - <a href "tcc_1111.html 
4 ZZ: Mary had a little lamb 
5 -<img src= "img/config-40x40.png" alt="config 
6 <img src="img/validate-40x50.png" alt="validate 
7 - user 

これが役立ちます。

+3

シェルでは、二重引用符が必要な場合(例:変数を展開する場合など)、文字列の周りに一重引用符を使用する必要があります。そのルールに従えば、FSを設定したときに二重引用符をエスケープする必要がない、という利点があります。つまり、 '-F"の代わりに\ "> | "' -F '"> |と書いてください。 '。 –

関連する問題