2つのawk式を(論理的OR)結合したいと思います。どちらも別々にうまく機能します。最初の式は、検索語の前の行を印刷します。 2番目の式は、特殊文字を含む行のみを印刷します。 OR演算子を介して2つの式を結合すると、エラーが発生します。
^ 予期しない改行文字または文字列の終わり
'
awk '(({$0~/\*/; print a; a=$0}) || (/\→/))' file.txt
file.txt は次のようになります。
foo
*
bla
bla
bar→
bar→
foo
*
bla
bla
bar→
foo
*
bla
bar→
bar→
予想される結果:
foo
bar→
bar→
foo
bar→
foo
bar→
bar→
答え1
説明に従って要件をお読みください。二つ様々な表現2つの異なる職業。あなたは言う:
First expression prints the line right before the search term
Second expression just prints the line that contains a special character
これは、両方の式をOR形式に結合できないことを意味します。 OR式と組み合わせて同じことを実行できます。
したがって、あなたの表現によると、正しい答えは次のようになります。
$ awk '/\*/{print a}{a=$0}/\→/' <<<"$a"
foo
bar→
bar→
foo
bar→
foo
bar→
bar→
2つの異なる条件で同じ操作を実行するためにOR条件を使用する必要がある場合は、次のようにすることもできます。
awk '/[*→]/{print a; a=$0}' file
答え2
印刷に関する注意事項より早い星印が見えると線が現れ現在のあなたが見るとき→
:
awk '/\*/ {print prev} /\→/ {print} {prev=$0}' file.txt
/pattern/ {action}
うん、短縮$0 ~ /pattern/ {action}
。最初のジョブは行にアスタリスクがある場合は変数を印刷し、2番目のジョブは行に矢印がある場合は現在の行を印刷し、prev
最後に無条件prev
次の行が一致したときに印刷できるように現在の行を保存します。
答え3
これは働きます:
awk '/\*/ || /→/ {print}' /path/to/file
答え4
これはあなたが引用した予想結果を提供します。 「POSIX awkとgawkでは、「*」、「+」、「?」演算子は、正規表現の演算子の前に何もない場合に自分自身を表します。詳しくはhttps://www.gnu.org/software/gawk/manual/gawk.html#Regexp
$ awk '/*/||/→/' file.txt
foo*
bar→
bar→
foo**
bar→
foo*
bar→
bar→
$
代わりにgrepを使用してください。
$ grep -E '\*|→' file.txt