我在一个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
希望这可以帮助