sed を使用して構成ファイルに新しい行を一致させて追加すると、重複行が生成されます。

sed を使用して構成ファイルに新しい行を一致させて追加すると、重複行が生成されます。

CONFIG_BLUEに一致するsedクエリを作成し、その下にCONFIG_GREENを追加しようとしています。私が作成したクエリは機能しますが、結果は同じ行が2回繰り返されます。

sedクエリ;

sed -i -e '/CONFIG_BLUE/a\' -e '# CONFIG_GREEN=y' test.txt

はい。

CONFIG_BLUE=y
CONFIG_GREEN=y
CONFIG_GREEN=y (This shouldn't be here)

私は正規表現に初めて触れました。私が間違っていることを知っていますか?

スクリプトの繰り返しコードスニペット(test1.txt、test2.txtなどを許可)は現在1つのファイルのみを使用し、それ以上のファイルには拡張されていません。

for i in test*.txt
do
  sed -i -e '/CONFIG_BLUE/a\' -e '# CONFIG_GREEN=y' test.txt
done

ベストアンサー1

GNUを使用すると仮定すると、ループはsedファイル内の正規表現が一致するたびに行を追加します。シェルワイルドカードパターンに一致する現在のディレクトリの各ファイル名に対して、同じファイルに同じ行を繰り返し追加します。# CONFIG_GREEN=yCONFIG_BLUEtest.txttest*.txt

に2行のテキストを追加するにはtest.txt

  1. test*.txt現在のディレクトリに一致するファイル名を持つ別のファイルが存在します。
  2. ループが実行される前でも、前の実行でテキスト行がすでにファイルに存在するか、
  3. 実行中だと思うコードが実行されていません。

の判断コメント、これは3つのケースのうち2番目です。

ループを変更するには、実際の呼び出しでループ変数を使用してくださいsed

for name in test*.txt; do
  sed -e '/CONFIG_BLUE/a\' -e '# CONFIG_GREEN=y' "$name"
done

現在、ファイルを変更せずに結果を確認して再実行できるように、-iGNUオプションを削除しました。sed適切な数のファイルがある場合は、sedファイル名グローブパターンを使用して直接呼び出しを実行して、すべてのファイルに対して順番に作業できます。 GNUを使用している場合は、-iここで内部編集も実行できます。sed

sed -i -e '/CONFIG_BLUE/a\' -e '# CONFIG_GREEN=y' test*.txt

おすすめ記事