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=y
CONFIG_BLUE
test.txt
test*.txt
に2行のテキストを追加するにはtest.txt
:
test*.txt
現在のディレクトリに一致するファイル名を持つ別のファイルが存在します。- ループが実行される前でも、前の実行でテキスト行がすでにファイルに存在するか、
- 実行中だと思うコードが実行されていません。
の判断コメント、これは3つのケースのうち2番目です。
ループを変更するには、実際の呼び出しでループ変数を使用してくださいsed
。
for name in test*.txt; do
sed -e '/CONFIG_BLUE/a\' -e '# CONFIG_GREEN=y' "$name"
done
現在、ファイルを変更せずに結果を確認して再実行できるように、-i
GNUオプションを削除しました。sed
適切な数のファイルがある場合は、sed
ファイル名グローブパターンを使用して直接呼び出しを実行して、すべてのファイルに対して順番に作業できます。 GNUを使用している場合は、-i
ここで内部編集も実行できます。sed
sed -i -e '/CONFIG_BLUE/a\' -e '# CONFIG_GREEN=y' test*.txt