特定の行を交換してアイデンティティを維持する

特定の行を交換してアイデンティティを維持する

インデントを含むファイルがあります。
特定の行を変更したいのですが、インデントを維持したいです。
ファイルには次の行があります。

   \t\t     customerId = "123" // has indentation in the start of line

私はこれを実行しています:

sed  -e 's:^\s*customerId = "'${OLD_ID}'": customerId = "'${NEW_ID}':' file

これはうまくいきません。私はそれが動作してもインデントを台無しにすることを知っています。この問題をどのように解決できますか?
メモ:解決策は必ずしもそうではありませんが、sedクロスプラットフォームであることを願っています。

修正する
@Gilles Quenotの答えをテストしました。

OLD_ID="1234"  
NEW_ID="5678"  
sed -E -i.bk "s:^(\s*)versionName = \"$OLD_ID\":\1versionName = \"$NEW_ID\":"   testfile   

テストサンプル:

name="Jim"
    customerId = "1234"

番号は変更されていません。

ベストアンサー1

使用標準sed:

sed "s:^\([[:blank:]]*customerId = \)\"$OLDID\":\1\"$NEWID\":" file

この[:blank:]パターンは単一のスペースまたはタブ文字と一致します。

このsed式は、IDより前のすべてのコンテンツをキャプチャし、それをキャプチャされたコンテンツと新しいIDに置き換えます。

たぶんその人がもっと良く見えるかもしれません。

sed 's:^\([[:blank:]]*customerId = \)"'"$OLDID"'":\1"'"$NEWID"'":' file

テスト:

$ cat file
name="Jim"
    customerId = "1234"

$ OLDID=1234
$ NEWID=321

$ sed 's:^\([[:blank:]]*customerId = \)"'"$OLDID"'":\1"'"$NEWID"'":' file
name="Jim"
    customerId = "321"

周囲のスペースが=オプションの場合は、次のものを使用できます。

sed 's:^\([[:blank:]]*customerId *= *\)"'"$OLDID"'":\1"'"$NEWID"'":' file

コメントでdon_crisstiが提案した別のアプローチは次のとおりです。

sed '/customerId *=/s/"'"$OLDID"'"/"'"$NEWID"'"/' file

これの利点は、キャプチャリンググループが必要ないことです。これにより、等号の後に単語を含む行を見つけ、その行customerIdのIDを置き換えます。

おすすめ記事