
比較的頻繁に更新したいファイルがあります。
やるべきことは、より多くの行を含むようにファイルの特定の部分を変更することです。これを行うには、sed
オプションを使用しています。したがって、次のように動作します。 \a
sed -i "/import:/a\$IMPORTED" file
最初は期待どおりに動作します。次に実行すると、このコマンドは同じ行を追加し続けます。
再実行する前にインポートしたすべてのアイテムを削除するにはどうすればよいですか?
たとえば、次の行の一部を使用して先頭に固定します。自動的に追加されません。
答え1
あなたの命令:
sed "/import:/a\$IMPORTED" infile
$IMPORTED
LinuxおよびGNU sedへのテキスト挿入の問題は、シェルが前のバックスラッシュを解釈していることです$
。正しく引用できます。
sed '/import:/a\'"$IMPORTED" infile
または、値を独自のスクリプトセクションに分割します。
sed -e '/import:/a\' -e "$IMPORTED" infile
sedスクリプトの一重引用符は常に良いです。
到着変える値old
にはnew
未定義数の行を含めることができます。
まず、パターン空間のすべての行をキャプチャします。
sed 'H;1h;$!d;x' ファイル
変更する値を設定します。
old='元の' new='新しい値'
以前の値を削除する(存在する必要があります):
sed -E -e 'H;1h;$!d;x' -e 's/(import:)(\n)'"$old"'/\1/g' ファイル
新しい入力を追加します。
sed -E -e 'H;1h;$!d;x' -e 's/(インポート:)(\n)'"$old"'/\1/g' -e 's/(インポート:) /\1\n'"$new"'/g' ファイル
コーナーの問題があります。変数に$old
NULL値(空)が含まれている場合、改行は削除されます。この問題を解決するには、次のものが必要です。
sed -E -e 'H;1h;$!d;x' -e 's/(import:)'"${old:+"(\\n)$old"}"'/\1/g' -e 's/(import:)/\1\n'"$new"'/g' infile