インデントを含むファイルがあります。
特定の行を変更したいのですが、インデントを維持したいです。
ファイルには次の行があります。
\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を置き換えます。