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

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

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

答え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

を使用するには、awkoptionsを使用して変数を渡す必要がありますbashawk-v

awk -v v=$VAR -v v1=$VAR1 '/v/ { print; print v1; next }1' ~/Scripts/tmp/file.txt

しかし、より正確で詳細な解決策については、Robの答えを確認してください。

関連情報