我的文件中有一行正在尝试使用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
答案 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
的任何版本)。如果不小心,它可能会破坏您的原始文件。 (当然,在测试过程中,您可能正在处理原始副本,但是在我的书中,必须在每次测试之前将文件还原到已知状态都是不必要的工作。将文件保持不变直到您之前都容易得多。知道脚本会起作用。)