我在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
我之前使用过这个命令,因为其他脚本运行正常,这次我做的唯一更改是file-name有一个文件的路径,但我尝试了它只是给文件名而不是路径获取进入路径并执行脚本但仍无法正常工作
我无法解决任何人的帮助
答案 0 :(得分:0)
如果您使用的是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
吗? ; - )
答案 1 :(得分:0)
旧的屁使用ed来解决这类问题:
cat / tmp / sample
#!/bin/ksh
lnum=5
str="Hello bar"
filename="/tmp/foo"
ed - $filename <<EOF
$lnum
i
$str
.
w
q
EOF
cat / 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
cat / tmp / foo
line
line
line
line
Hello bar
line
line
line
line
line
i
在a
之后“追加”之前是“插入”。我不知道sed i命令究竟做了什么,但我希望它与i
希望这有帮助