我有一个包含许多内容的文本文件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
)。