同じ内容を繰り返し再挿入せずに、ファイルの途中に新しいテキストを挿入して古いテキストを置き換えますか?

同じ内容を繰り返し再挿入せずに、ファイルの途中に新しいテキストを挿入して古いテキストを置き換えますか?

比較的頻繁に更新したいファイルがあります。
やるべきことは、より多くの行を含むようにファイルの特定の部分を変更することです。これを行うには、sedオプションを使用しています。したがって、次のように動作します。 \a

sed -i "/import:/a\$IMPORTED" file  

最初は期待どおりに動作します。次に実行すると、このコマンドは同じ行を追加し続けます。
再実行する前にインポートしたすべてのアイテムを削除するにはどうすればよいですか?
たとえば、次の行の一部を使用して先頭に固定します。自動的に追加されません。

ベストアンサー1

あなたの命令:

sed "/import:/a\$IMPORTED" infile

$IMPORTEDLinuxおよび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' ファイル

コーナーの問題があります。変数に$oldNULL値(空)が含まれている場合、改行は削除されます。この問題を解決するには、次のものが必要です。

sed -E -e 'H;1h;$!d;x' -e 's/(import:)'"${old:+"(\\n)$old"}"'/\1/g' -e 's/(import:)/\1\n'"$new"'/g' infile

おすすめ記事