使用sed表达式获取错误

时间:2013-07-04 12:46:07

标签: linux shell unix sed aix

我在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有一个文件的路径,但我尝试了它只是给文件名而不是路径获取进入路径并执行脚本但仍无法正常工作

我无法解决任何人的帮助

2 个答案:

答案 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

ia之后“追加”之前是“插入”。我不知道sed i命令究竟做了什么,但我希望它与i

相同

希望这有帮助