使用sed命令的空间问题

时间:2017-04-09 10:53:01

标签: shell unix sed sh

var = abc cde fgh ijk

我跑到命令

下面
 sed -i '$s/}/,\n"filename":"'$var'/g"}/'

低于错误

sed: -e expression #1, char 32: unterminated `s' command

因为“abc cde fgh ijk”在字符串值之间有空格。

预期输出是打印:abc cde fgh ijk

谢谢

3 个答案:

答案 0 :(得分:0)

试试这个 -

$cat f
Hello vipin
$var="abc cde fgh ijk"
$sed "s/Hello/$var/g" f
abc cde fgh ijk vipin

答案 1 :(得分:0)

$var更改为"$var"。否则,var中的空格对于作为arg分隔符的bash是可见的,从而终止sed“程序”。

答案 2 :(得分:0)

这里有一些问题。首先,是的,这些空格让sed混乱,因为你没有引用它们。然后,您在g}/中也有语法错误。替换运算符的语法是:

s/original/replacement/options

例如:

s/foo/bar/g

但你正在使用:

s/foo/bar/g"}/

在任何情况下,除非文件的最后一行有多个},否则g毫无意义。

因此,根据您实际尝试做的事情,您需要其中一个(UI已删除-i以显示输出,再次添加以使替换修改原始文件):

$ cat file 
foo
bar}
$ sed  '$s/}/,\n"filename":"'"$var\"\}/" file 
foo
bar,
"filename":"abc cde fgh ijk"}

或者

$ cat file
foo
bar}}}
$ sed  '$s/}/,\n"filename":"'"$var\"\}/g" file 
foo
bar,
"filename":"abc cde fgh ijk"},
"filename":"abc cde fgh ijk"},
"filename":"abc cde fgh ijk"}

当然,更简单的方法是设置var来保存整个目标替换,引号和所有:

$ cat file
foo
bar}
$ var=',\n"filename":"abc cde fgh ijk"}'
$ sed "\$s/}/$var/" file 
foo
bar,
"filename":"abc cde fgh ijk"}

请注意,现在我们使用的是双引号,$表达式中的sed需要进行转义。