我在外壳程序脚本中使用此命令

lnum=5
str="Hello foo"
filename="/path/fiename"

 sed -i "$lnum i $str" $filename


出现以下错误

sed: -e expression #1, char 3: : doesn't want any addresses


我之前曾在其他脚本上使用过此命令,但该脚本运行良好,这次我所做的唯一更改是文件名具有文件的路径,但是我尝试通过仅给出文件名而不是路径来尝试进入路径和执行脚本,但仍然无法正常工作

我无法解决,任何人都可以帮忙

最佳答案

如果使用的是sed的OSX,BSD(和AIX)版本,则-i就地编辑标记的备份扩展名不是可选的。

我相信GNU sed对此有所不同,因此该脚本可能在Linux上有效。

这给可移植性带来了一点痛苦-但是当使用从BSD派生的sed进行“就地”编辑时,情况变得更糟。在某些方面,此版本的sed可以说是更“标准”的(例如:“ POSIX系统中的最低公分母”),但是这种行为似乎是一个错误:

sed: 1: "5 i hello foo": command i expects \ followed by text


这是我如何使您的脚本在几种BSD风格上工作:

lnum="5"
str="Hello foo"
filename="sed-mess.txt"

sed -i "" "$lnum i\^M
$str" $filename


由于必须使用Ctrl-v [Return],因此必须使用i输入文字行结束符才能使\命令正常工作。不知道GNU sed将如何处理。

可以使用perl吗? ;-)

关于linux - sed表达式出错,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17470697/

10-10 17:40
查看更多