2017-07-20 12 views
0

これはすでにそこにあるかどうかはわかりませんが、検索フィールドで何をしたいかを表現しようとすると何か問題があります。if文を実行し、bashスクリプトを実行します。

は、私は、次の

foo1 
foo2 
foo3 
barbarbar 
barbarbar 
barbarbar 
foo4 
foo5 
barbarbar 
barbarbar 
barbarbar 
foo6 
foo7 

のようなファイルを持っていたと言う、私は唯一の「のfoo#」の後に「フー#」以外の何かを持っているフィールドを取得したいです。私はまた、 "foo#"がそれの後にbarbarbarを持っていて、次の "foo#"までそれを永久に持っていれば、印刷されることを望みます。出力例は以下の通りです。

この sedコマンドが動作するように見えます
foo3 
barbarbar 
barbarbar 
barbarbar 

foo5 
barbarbar 
barbarbar 
barbarbar 
+0

、と私はこのようなもののためのawkを使用したいですあなたはどこにいらっしゃいますか? –

+1

ヒントが必要な場合は.. https://stackoverflow.com/questions/38972736/how-to-select-lines-between-two-patternsを参照してください。ロジックを簡略化する方法は、入力ファイルの行を賢明にtac)、 'barbarbar'を開始パターンとして、' foo'を終了パターンとして使用します。最後に出力を再度反転します。 – Sundeep

+1

@sundeep、良いアイデア。さらに簡単なことは、foo *が存在しないことを開始パターンとして使用することです。 –

答えて

2

sed -n '/^foo[0-9]$/{N;:l;/\nfoo[0-9]$/{D;bl};p;b};p' 

私は正直にいえsedでそれをやろうと後悔し、結果はほとんど分かりやすいです。

/^foo[0-9]$/{  # if a line matches fooX 
    N    # retrieve another line 
    :l    # we'll jump to here later ; label l 
    /\nfoo[0-9]$/{ # if the following line matches fooX too 
     D    # discard the first line and consume another one 
     bl    # jump back to l 
    }    # at this point we have a fooX line followed by a non-fooX line 
    p    # print what we've matched 
    b    # stop processing this line (jump to the end of the script) 
}     # reached when the first line read doesn't match fooX 
p     # print the line 

編集:今、私はこのようにそれを置いたので、私はそれが最後のpに達することによって同じように動作しますので、p;b一部を除去することができることに注意してください。もし私がこれを維持しなければならない貧しい魂なら、私はむしろそこに持っていると思う。

+0

私はあらゆるハッカーがこれまでsedについて言いました。 –

1

「試したことはありません」という質問には通常回答を投稿したくありませんが、私は手にしています。

「ステートマシン」アプローチ:

awk ' 
    /foo/ && afterfoo != "" { print currentfoo; print afterfoo; afterfoo = "" } 
    /foo/ { currentfoo = $0 } 
    !/foo/ { afterfoo = afterfoo $0 "\n" } 
    END { if (afterfoo != "") {print currentfoo; print afterfoo} } 
' file 

「逆プロセス逆の」アプローチ:あなたは試してみました何

tac file | awk ' 
    !/foo/ { print; seenfoo = 0 } 
    /foo/ && !seenfoo++ 
' | tac 
+0

私は 'awk '/ foo/{s = $ 0; c = 1;次}} --c == 0 {print s} 1''と 'tac file | sed -n '/ barbarbar /、/ foo/p' |タック – Sundeep

関連する問題