我有一个文件想要相对频繁地更新。
需要做的是更改文件的特定部分以包含更多行。我正在使用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 脚本总是更好。
到代替一个old
值new
可能包含未定义的行数,您需要
首先:捕获模式空间中的所有行:
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