Shell 使用sed命令的空间问题

Shell 使用sed命令的空间问题,shell,unix,sed,sh,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 谢谢试试这个- $cat f Hello vipin $var="abc cde fgh ijk" $sed "s/Hel

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

谢谢

试试这个-

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

$var
更改为
“$var”
。否则,bash可以看到
var
中的空格作为arg分隔符,从而终止sed“program”。

这里有一些问题。首先,是的,空格是混乱的
sed
,因为您传递的是不带引号的空格。然后,在
g}/
中还有一个语法错误。替换运算符的语法为:

s/original/replacement/options
例如:

s/foo/bar/g
但您正在使用:

s/foo/bar/g"}/
在任何情况下,除非文件的最后一行有多个
}
,否则
g
是没有意义的

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

$cat文件
福
bar}
$sed'$s/}/,\n“文件名”:““$var\”\}/”文件
福
酒吧,
“文件名”:“abc cde fgh ijk”}

$cat文件
福
bar}}}
$sed'$s/}/,\n“文件名”:““$var\”\}/g”文件
福
酒吧,
“文件名”:“abc cde fgh ijk”},
“文件名”:“abc cde fgh ijk”},
“文件名”:“abc cde fgh ijk”}
当然,更简单的方法是设置
var
来保存整个目标替换、报价和所有:

$cat文件
福
bar}
$var=',\n“文件名”:“abc cde fgh ijk”}
$sed“\$s/}/$var/”文件
福
酒吧,
“文件名”:“abc cde fgh ijk”}

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

谢谢你的回复。我试图获取变量名filename的var值。所以我试着用下面的命令$sed-i'$s/}/,\n“filename”:“$var/g'}/”file.json sed:-e expression#1,char 23:unterminated`s'命令得到相同的错误我只想用空格读取var(abc cde fgh ijk),但如果我使用/g,我会得到相同的错误尝试这个-
sed-i“s/}/,\n文件名:$var/g”file.txt
vipin,实际上它就像一个循环过程,所以我需要使用}/。如果我使用它显示相同的错误。如果您可以共享输入文件和预期的输出,则解决此查询会更容易。如果我使用“”,则意味着将其作为字符串并像$var一样打印,但我想打印abc cde fgh Ijkt在您的输入中没有
}
,那么您希望
s/..
能做什么?您的问题是提供更清晰、更具代表性的样本输入和预期输出,因为感觉您的真实数据实际上与您向我们展示的样本不同。如果您试图修改JSON值,请将
sed
放在一边,并使用
jq
等工具。感谢您的明确解释,在json文件中,我有以下详细信息var=abc cde fgh ijk example.json{“ETag”:“c4892521fa354447xxxxxxxx\,“元数据”:{}查询:sed-i'$s/}/,\n“文件名”:“$var''}/”示例。json预期输出:{“ETag”:“c489228521fa35447xxxxxxxxx\,”元数据:{},“文件名”:“abc cde fgh ijk”}但是错误显示为sed:-e表达式#1,char 19:unterminated's'comman