0

我在 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

我之前曾将此命令用于其他脚本,它运行良好,这次我所做的唯一更改是文件名具有文件的路径,但我尝试只给出文件名而不是通过进入路径的路径并执行脚本,但它仍然不起作用

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

4

2 回答 2

0

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

我相信GNUsed对此有所不同,因此该脚本可能适用于 Linux。

这对可移植性来说有点麻烦——但是当sed使用 BSD 派生时,“就地”编辑会变得更糟。这个版本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命令正常工作,因为\它是必需的,并且后面必须没有任何内容。不确定 GNUsed会如何处理这个问题。

你能用perl吗?;-)

于 2013-07-04T19:20:22.807 回答
0

老屁用 ed 来解决这类问题:

猫/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

厕所 /tmp/foo

   9       9      45 /tmp/foo

/tmp/样本

line

厕所 /tmp/foo

  10      11      55 /tmp/foo

猫/tmp/foo

line
line
line
line
Hello bar
line
line
line
line
line

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

希望这可以帮助

于 2013-07-05T12:42:14.653 回答