sed:-e 表达式 #1,字符 32:未终止的“s”命令

sed:-e 表达式 #1,字符 32:未终止的“s”命令

我有一个包含许多内容的文本文件groupid = []。我想编辑第 41 行,我该怎么做?

我的命令:sed -i "s/groupid = []/groupid = [ 2 ]/" rights.toml

我努力了:

sed -i "s@groupid = []@groupid = [ 2 ]@" rights.toml
sed -i -e "s@groupid = []@groupid = [ 2 ]@g" "rights.toml"
sed -i "41 s/groupid = []/groupid = [ 2 ]/g" rights.toml
sed -i "41,s/groupid = []/groupid = [ 2 ]/g" rights.toml
sed -i "41s/groupid = []/groupid = [ 2 ]/g" rights.toml

答案1

sed 命令的问题

s/groupid = []/groupid = [ 2 ]/

[]替代命令左侧的特殊字符,因此它会解释

]/groupid = [ 2 

作为在 之后匹配的一组字符groupid =。由于这会“吃掉”第一个/,因此您的命令看起来像s/pattern/,而不是s/pattern/replacement

至少,你需要逃避开头[以使其符合字面意思 - 我可能也会逃避结尾]以使其意图明确:

sed "s/groupid = \[\]/groupid = [ 2 ]/" rights.toml

您可以添加地址来指定特定的线路

sed "41s/groupid = \[\]/groupid = [ 2 ]/" rights.toml

但是你的文件似乎没有groupid第 41 行。顺便说一句,我建议' '在 sed 表达式周围使用单引号而不是双引号除非您明确需要在其中执行 shell 扩展。

然而如果您的文本是,那么您真的应该考虑使用 TOML 感知工具而不是 sed TOML例如,使用yq:命令行 YAML/XML/TOML 处理器 - YAML、XML、TOML 文档的 jq 包装器 在 TOML 模式下:

tomlq -t '.rule[0].groupid |= [2]' rights.toml

(同样,不清楚您是否要修改rule[0]rule[1]因为第 41 行似乎不包含groupid)。

相关内容