定数ネイバーがある列のみを出力する方法は?

定数ネイバーがある列のみを出力する方法は?

入力する

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つの方法があると思います。

  1. 潜在的な一致をサイド変数に保存し、ZZZが見つかったら印刷します。
  2. s/XXX ..私たちの文字列..ZZZ/ ..私たちの文字列../

最初はかなり手がたくさん行くようで、試してさえしません。方法2では、次のことが発生します。

$ sed 's/.*XXX \(.*\) ZZZ.*/\1/' data.txt 
Y1Y
Y2Y
AAAa YXX Y2Y ZZZ TT GGGG UU

したがって、一致するものを見つけることはうまく機能しますが、一致しない行に対しては何もしません。これらの行を削除するように指示する方法がある場合があります。sedこの場合、これは代替ソリューションになる可能性があります。

関連情報