在文件中间插入新文本替换旧文本,而无需一遍又一遍地重新插入相同的内容?

在文件中间插入新文本替换旧文本,而无需一遍又一遍地重新插入相同的内容?

我有一个文件想要相对频繁地更新。
需要做的是更改文件的特定部分以包含更多行。我正在使用sed\a选项来执行此操作:
所以这有效:

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

第一次按预期工作。在下一次重新运行时,此命令会在同一行上一遍又一遍地追加。
我该如何处理这个问题,以便在再次运行之前以某种方式删除导入的所有内容?
例如,使用以下一些行来锚定在开头,我知道这些行不会自动添加或类似的内容?

答案1

您的命令:

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

$IMPORTED正在linux 和 GNU sed 上插入文字。问题在于 shell 正在解释 之前的反斜杠$。您可以正确引用:

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

或者,将值拆分到其自己的脚本部分中:

sed -e '/import:/a\' -e "$IMPORTED" infile

单引号 sed 脚本总是更好。

代替一个oldnew可能包含未定义的行数,您需要

  • 首先:捕获模式空间中的所有行:

    sed 'H;1h;$!d;x' infile

  • 设置要更改的值:

    旧='原始' 新='新值'

  • 删除旧值(必须存在):

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

  • 添加新输入:

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

有一个角落问题,如果变量$old包含空值(空),则换行符将被删除。为了解决这个问题,我们需要:

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

相关内容