私のbashスクリプトには、awkを使用して検索するためにパターンに渡そうとしている変数があります。しかし、私が予想していたことが機能していません。次のテキストファイル(text.txt)があります。
-----------
Task: a
(some info)
....
------------
Task: b
(some info)
....
------------
Task: c
(some info)
....
------------
私のスクリプトは次のとおりです。
letter=a
awk -v var="$letter" '/Task .* \var/' RS='-+' text.txt
しかし、これを行うと、次のことを行った場合にしか何も得られません。
awk '/Task .* a/' RS='-+' text.txt
私は私が期待するものを手に入れます:
Task: a
(some info)
....
注:変数を絶えず変化させるループがあり、それを探しているので、変数として渡す必要があります。私はawkを使用したいと思っています。これは、私が最もよく知っていることですが、sedやgrepなどの他の提案を聞くことに反対していません。
パターン全体をawkに渡すことができます
letter=a
awk -v pattern="Task .* $letter" -v RS='-+' '
$0 ~ pattern
' text.txt
またはawkで文字列としてパターンを作成します
letter=a
awk -v ltr="$letter" -v RS='-+' '
BEGIN {pattern = "Task .* " ltr}
$0 ~ pattern
' text.txt
Awk変数の前には$
が付いていないため、/regex constant/
内に埋め込むことはできません-そこにあるのは単なるテキストです。
(すべてのawk変数を-v
で前に置くのが私の好みです)
あなたの最良の選択は、環境を通して変数を渡すかもしれません:
letter=a
p="Task: *$letter" awk -v RS='-+' '$0 ~ ENVIRON["p"]' <file
または:
p="Task: *a" awk -v RS='-+' '$0 ~ ENVIRON["p"]' <file
-v var=value
、awk
を使用すると、値のエスケープシーケンスが展開されます。 Shellからawk
にデータをそのまま渡す場合、-v var="$Shell_var"
は信頼できません。
ENVIRON
(またはARGV
)を使用すると、awk
がエスケープシーケンスを展開しないため、より信頼性が高くなります。