入力する
AA XXX Y1Y ZZZ GG dhz
rr (AAAa) XXX Y2Y ZZZ TT GGGG UU
出力
Y1Y
Y2Y
入力ラインは異なる場合があります。 Y1Y以前のXXXとY1Y以降のZZZだけが定数です(このようにXXXとZZZの隣人です)。 Y1Yは何でも構いません(例:Y1Y、Y2Y、Y1Tなど)。
尋ねる:awk、sed、grepを使って出力を取得するには? (それとももっと良いツールがありますか?)
修正する(質問):「.」がありますが、なぜY1Yでは動作しませんか?
[user@notebook ~] echo 'XXX Y1Y ZZZ' | grep -Po "(?<=XXX )(\w+)(?= ZZZ)"
Y1Y
[user@notebook ~] echo 'XXX Y1.Y ZZZ' | grep -Po "(?<=XXX )(\w+)(?= ZZZ)"
[user@notebook ~]
答え1
grep
付属のPCREツールを使用してこれを行うことができます。
$ grep -Po "(?<=XXX )\S+(?= ZZZ)" data.txt
Y1Y
Y2Y
詳細
このソリューションでは、PCRE の振り返りとプレビュー機能を活用して、固定長文字列を一致させます。
上記は、それぞれの背面を見ていることを\w+
確認XXX
し、それぞれの頭部を見て\w+
いることを確認することですZZZ
。もしそうなら、一致するものです。スイッチは一致するものだけを印刷するように指示-o
します。grep
\w+
次に、sedを使用して実行できますか?
私はこの問題を解決できないと思いますsed
。私は2つの方法があると思います。
- 潜在的な一致をサイド変数に保存し、ZZZが見つかったら印刷します。
- s/XXX ..私たちの文字列..ZZZ/ ..私たちの文字列../
最初はかなり手がたくさん行くようで、試してさえしません。方法2では、次のことが発生します。
$ sed 's/.*XXX \(.*\) ZZZ.*/\1/' data.txt
Y1Y
Y2Y
AAAa YXX Y2Y ZZZ TT GGGG UU
したがって、一致するものを見つけることはうまく機能しますが、一致しない行に対しては何もしません。これらの行を削除するように指示する方法がある場合があります。sed
この場合、これは代替ソリューションになる可能性があります。