获取sedexpression式的错误

我在一个shell脚本中使用这个命令

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 

我曾经使用过这个命令之前,其他脚本工作正常,这一次我做的唯一的改变是文件名有一个文件的path,但我试着只是给文件名,而不是path进入path并执行脚本,但仍然无法正常工作

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

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

我相信GNU sed不同,所以这个脚本可能在Linux上工作。

这对于可移植性来说有点痛苦 – 但是当使用BSD派生的sed时,“in-place”编辑会变得更糟。 这个版本的sed在某些方面可以说是更“标准”的(例如:“跨POSIX系统的最低公分母”),但是这种行为看起来像一个bug:

 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不得不使用i命令。 不知道GNU sed如何处理这个问题。

你可以使用perl吗? 😉

老屁使用这种类型的问题:

猫/ tmp /样本

 #!/bin/ksh lnum=5 str="Hello bar" filename="/tmp/foo" ed - $filename <<EOF $lnum i $str . w q EOF 

猫/ tmp / foo

 line line line line line line line line line 

wc / tmp / foo

  9 9 45 /tmp/foo 

的/ tmp /样品

 line 

wc / tmp / foo

  10 11 55 /tmp/foo 

猫/ tmp / foo

 line line line line Hello bar line line line line line 

i是“插入”之前,而之后是“追加”之后。 我不知道我的sed命令是做什么的,但我希望它会和i

希望这可以帮助