特定の行の他の変数テキストの後に変数テキストを挿入します。

特定の行の他の変数テキストの後に変数テキストを挿入します。

特定の行の他の変数テキストの後に変数テキストを挿入しようとしています。以下はこれまで試してみました。変数を表示して適用し続けるために引用符をエスケープできるかどうかを知る限り、うまくいく必要があります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/" …シェルが値をVARawkフラグメントに拡張するようにします。たとえば、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

おすすめ記事