特定の行の他の変数テキストの後に変数テキストを挿入しようとしています。以下はこれまで試してみました。変数を表示して適用し続けるために引用符をエスケープできるかどうかを知る限り、うまくいく必要があります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
答え2
可能なAWKソリューションの1つ:
awk '/'$VAR'/ { print; print "'$VAR1'"; next }1'
すべての外部変数の周りに引用符を囲みます。
他の提案された投稿などの変数を渡すもう1つの可能な解決策は、VAR1をawk変数として渡すことです。しかし、単一引用符ブロックをエスケープするには、まだVARを使用する必要があると思います。
awk -v var=$VAR1 '/'$VAR'/ { print; print var; next }1'
sedを試してみてください。 :) この種の置換のために特別に設計されています。
sed "s/$VAR.*/\0\n$VAR1/" ~/Scripts/tmp/file.txt
1行に複数のVARインスタンスがある可能性がある場合は、sedコマンドの最後にg(グローバル)を追加しても、見つかった最初の一致で停止しません。
sed "s/$VAR.*/\0 $VAR1/g" ~/Scripts/tmp/file.txt
重要! : '/'文字がVARまたはVAR1変数に表示されないことを確認してください。可能であれば、その文字をawkまたはsedにエスケープする必要があります。または、sedを使用してコマンドの区切り文字を';
sed "s;$VAR.*;\0\n$VAR1;" ~/Scripts/tmp/file.txt
sedコマンドの説明:
sedコマンドの周りの単一引用符の代わりに二重引用符を使用して、VARやVAR1などの変数がその値に置き換えられます。解決する必要がある変数の内容(awkの場合でも)は、 次の形式の代替コマンドを
作成することを意味します。使用されます。コマンドの一部に; を付けると、上記のように$ VAR変数の内容を一致させる必要があります。
あっ.. 下の列の部分は見えませんでした.. パターンが固定されていますね。
答え3
を使用するには、awk
optionsを使用して変数を渡す必要がありますbash
。 awk
-v
awk -v v=$VAR -v v1=$VAR1 '/v/ { print; print v1; next }1' ~/Scripts/tmp/file.txt
しかし、より正確で詳細な解決策については、Robの答えを確認してください。