sedは文字列を見つけて置き換えます。

sedは文字列を見つけて置き換えます。

複数のファイルに次の行があります。

<update>2013-02-10</update>
<version>1.15</version>

(新しい日付とバージョン)に置き換えたいです。

<update>2019-06-30</update>
<version>1.28</version>

sedまたはawkを使用して複数のファイルに対してこれをどのように実行できますか? (私はMacオペレーティングシステムを使用しています)

編集1:行が<update> and <version>1つずつ順番に表示されないので、その行が表示されるたびに変更したいと思います。

編集2:日付は異なりますが、文字列は<update>そうではないので、「2013-02-10」を見つけて「新しい日付」に置き換えることはできません。

答え1

sed -i backup -E '/<update>/s/[0-9]{4}-[0-9]{2}-[0-9]{2}/2019-06-30/;/<version>/s/[0-9]\.[0-9]{1,2}/1.28/' *
  • -i backupファイルがある場所で編集しますが、拡張子を保持することを意味しますbackup。コマンドが期待どおりに機能したら、削除できます。別のことをしたらバックアップがあってよかったです!
  • -E正規表現を拡張するために使用されます。エスケープする必要はないので、スクリプトを読みやすくします。{}
  • パターンがある各行の日付文字列を/<update>/指定された日付に置き換えます。s/[0-9]{4}-[0-9]{2}-[0-9]{2}/2019-06-30/####-##-##
  • パターンがある各行に対して、バージョン文字列を/<version>/指定されたバージョンに置き換えるか、s/[0-9]\.[0-9]{1,2}/1.28/#.##.##

答え2

2つのコマンドを入力しても問題ない場合は、次のものを使用できます。

sed -i 's/\<update\>2013-02-10\<\/update\>/2019-06-30\<\/update\>/g' *

sed -i 's/\<version\>1.15/1.28\<\/version\>/g' *

ファイルがあるホームディレクトリにあります。

または再帰的に実行したい場合:

find ./ -type f -exec sed -i 's/\<update\>2013-02-10/2019-06-30\<\/update\>/' {} \;

find ./ -type f -exec sed -i 's/\<version\>1.15/1.28\<\/version\>/' {} \;

関連情報