Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 获取sed表达式的错误_Linux_Shell_Unix_Sed_Aix - Fatal编程技术网

Linux 获取sed表达式的错误

Linux 获取sed表达式的错误,linux,shell,unix,sed,aix,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 我以前在其他脚本中使用过这个命令,它工作得很好,这次我做的唯一更改是文件名有一个指向文件的路径,但是我尝试了只给出文件名而不是路径,通过进入路径并执行脚本,但

我正在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
我以前在其他脚本中使用过这个命令,它工作得很好,这次我做的唯一更改是文件名有一个指向文件的路径,但是我尝试了只给出文件名而不是路径,通过进入路径并执行脚本,但仍然不起作用


我无法解决此问题。如果您使用的是OSX、BSD(和AIX)版本的
sed
,则
-I
就地编辑标志的备份扩展不是可选的

我相信GNU
sed
在这一点上有所不同,因此该脚本可以在Linux上工作

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


你会使用perl吗?;-)

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

cat/tmp/样品

#!/bin/ksh

lnum=5
str="Hello bar"
filename="/tmp/foo"

ed - $filename <<EOF
$lnum
i
$str
.
w
q
EOF
line
wc/tmp/foo

   9       9      45 /tmp/foo
  10      11      55 /tmp/foo
/tmp/样品

#!/bin/ksh

lnum=5
str="Hello bar"
filename="/tmp/foo"

ed - $filename <<EOF
$lnum
i
$str
.
w
q
EOF
line
wc/tmp/foo

   9       9      45 /tmp/foo
  10      11      55 /tmp/foo
cat/tmp/foo

line
line
line
line
line
line
line
line
line
line
line
line
line
Hello bar
line
line
line
line
line
i
前面是“插入”,而
a
后面是“附加”。我不知道sed I命令的具体功能,但我希望它与
I


希望这能有所帮助提示:分隔符到哪里去了?我已经在脚本中进行了尝试,效果很好。发布更多信息,您使用的是哪个
shell
?哪个版本的
sed
?AIX
sed
(如果您正在使用)似乎不支持
-i
开关;另外,插入(
i
)命令后面需要跟一个`\`(请参阅)堆栈溢出是编程和开发问题的站点。这个问题似乎离题了,因为它与编程或开发无关。请参见帮助中心中的。也许或将是一个更好的提问场所。请参阅以获取更多讨论。POSIX,救救我们!奇怪为什么有人认为这个答案没有用。它演示了如何使用ed而不是sed。sed具有ed所没有的各种限制。