sed または awk コマンドを使用して、ある単語を変数に格納されている別の単語に置き換えます。

sed または awk コマンドを使用して、ある単語を変数に格納されている別の単語に置き換えます。

以下のファイルでは、「100」を変数に格納されている値に置き換える必要があります。

ファイル.txt:

dropNumber = 100
patchNumber = 8.8.0.80
randomNumber = 10000
versionCode = dropNumber + patchNumber

失敗したいくつかのオプションを試しました。 1)

NEW_DROP_NUMBER=200
OLD_DROP_NUMBER=$(cat file.txt | grep dropNumber | head -1 | sed 's/^.*= //')
echo "Drop Number: $NEW_DROP_NUMBER" | awk -v srch="$OLD_DROP_NUMBER" -v repl="$NEW_DROP_NUMBER" '{ sub(srch,repl,$0); print $0 }' file.txt > file.txt &&  mv properties.tmp file.txt

このアプローチは、意図しないRandomNumber値も置き換えます。

2)

sed -i -e 's/$OLD_DROP_NUMBER/$NEW_DROP_NUMBER/g' file.txt 

これにより、「sed:s / 100 / 200 / g:そのファイルまたはディレクトリがありません」というエラーが返されます。

予想される値だけを変更するようにコマンドを設計するのに役立つ人はいますか?

ベストアンサー1

awkプログラムには以下が含まれます。モード{アクション}例: 提供しない場合模様、その後行動すべてのレコードに適用されます。あなたの場合は、次に始まるレコード(行)のみを一致させるパターンを追加できますdropNumber

awk ... '/^dropNumber/ { sub(srch,repl,$0) } { print }' ...

Sedに似ており、正規表現を使用します。住所必須ラインのみ:

sed "/^dropNumber/s/$OLD_DROP_NUMBER/$NEW_DROP_NUMBER/"

(質問に示されている一重引用符の代わりに二重引用符が必要です。そうしないと、シェル変数は文字列リテラルとして扱われます。)

おすすめ記事