特定の行の他の変数テキストの後に変数テキストを挿入しようとしています。以下はこれまで試してみました。変数を表示して適用し続けるために引用符をエスケープできるかどうかを知る限り、うまくいく必要がありますawk
が、方法はわかりません。
#!/bin/sh
VAR=$(head -n1 ~/Scripts/tmp/file.txt)
VAR1=$(head -n1 ~/Scripts/tmp/file1.txt)
awk '/$VAR/ { print; print "$VAR1"; next }1' ~/Scripts/tmp/file.txt
ベストアンサー1
awkスクリプトに文字列を渡すには、環境変数を介して渡します。
export VAR VAR1
awk '
1
$0 == ENVIRON["VAR"] {print ENVIRON["VAR1"]}
' ~/Scripts/tmp/file.txt
ロジックをより簡単にするためにスクリプトを再構成しました。また、正規表現の一致を文字列比較に置き換えました。正規表現マッチングは$VAR
正規表現として扱われ、文字列比較は実行されません。/$VAR/
必要な値も使用しませんVAR
(これはawkではなくPerl構文です)match($0, VAR)
。
実際には機能しない他の解決策に関する注意事項(変数に特殊文字が含まれていない場合にのみ機能し、特殊文字は方法によって異なります):
awk -v awkvar="$VAR" '$0 == awkvar …'
行の内容からバックスラッシュを展開します。awk "/$VAR/" …
シェルが値をVAR
awkフラグメントに拡張するようにします。たとえば、file.txt
含まれている場合は^/ {system("touch ~/naughty")} /
コマンドを実行します。touch ~/naughty
もう1つの方法は、awkにすべてのファイルを読み取らせることです。
awk '
BEGIN { VAR1 = getline <"~/Scripts/tmp/file1.txt"; }
NR == 1 {VAR = $0}
1
$0 == ENVIRON["VAR"] {print ENVIRON["VAR1"]}
' ~/Scripts/tmp/file.txt