以下のファイルでは、「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/"
(質問に示されている一重引用符の代わりに二重引用符が必要です。そうしないと、シェル変数は文字列リテラルとして扱われます。)