使用sed替换文件中的行的问题

时间:2018-10-26 17:32:11

标签: bash sed

我的文件中有一行正在尝试使用sed -i替换,但一直遇到问题。

该行是

  

set feat_files(1)“ / Users / lab / Desktop / 1026 / 20170802151230_1”

我想将其更改为

  

set feat_files(1)“ / Users / lab / Desktop / 1026 / 20170802151230_2”

到目前为止,我还没有尝试过以下方法:

line_old="/Users/lab/Desktop/1026/20170802151230_1" line_new="/Users/lab/Desktop/1026/20170802151230_2"

sed -i '' 's/feat_files(1) '$line_old'/feat_files(1) '$line_new'/' $file

3 个答案:

答案 0 :(得分:0)

还不够吗?:

sed -i '' 's/20170802151230_1/20170802151230_2/'

答案 1 :(得分:0)

问题是单引号。替换为shell变量时,请使用双引号。

$ sed "s|$line_old|$line_new|g" input_file 
set feat_files(1) "/Users/lab/Desktop/1026/20170802151230_2"

答案 2 :(得分:0)

替换文本中的斜杠会使sed命令的内容和路径名混淆s///。修复很容易-使用其他字符标记替代命令的各个部分:

sed "s%feat_files(1) $line_old%feat_files(1) $line_new%" $file

它使用%代替/;您可以使用文件名中没有出现的任何字符。如果您认为%可能会出现一段时间,请考虑使用 Control-A 或其他控制字符。

如果需要,您甚至可以更改标记搜索(匹配)正则表达式结尾的字符:

sed "\\%feat_files(1) $line_old%,\\%feat_files(1) $line_new% { … }"

匹配$line_old$line_new中的模式之间的线。

由于变量,我使用双引号。一种替代方法是执行问题开始的操作,并使用单引号,但您仍应将变量用双引号引起来:

sed 's%feat_files(1) '"$line_old"'%feat_files(1) '"$line_new"'%' $file

问题中的代码必须在具有BSD sed的Mac上运行。 GNU sed变体不喜欢​​-i选项后的空参数;您只需使用GNU -i指定sed来进行原位替换。为了实现可移植性,您需要使用-i.bak,并在-i选项上附加非空后缀-并且必须删除备份。

在您掌握了基础知识之前,请勿使用-i选项(对于sed的任何版本)。如果不小心,它可能会破坏您的原始文件。 (当然,在测试过程中,您可能正在处理原始副本,但是在我的书中,必须在每次测试之前将文件还原到已知状态都是不必要的工作。将文件保持不变直到您之前都容易得多。知道脚本会起作用。)