Sed命令在模式匹配时添加字符



我有如下文件的内容:

data {
x = "name",
y = "job"
z = "role"
}

当它丢失时,我想在花括号前面添加=,否则忽略它

输出应为:

data = {
x = "name",
y = "job"
z = "role"
}

我试过了,但没用。sed -r -ie 's|data { | data = {|g' abc.txt

有人能告诉我做错了什么吗?

感谢

您可以使用

sed -r -i 's|(data)[[:space:]]*({)|1 = 2|g' abc.txt
sed -i 's|data[[:space:]]*{|data = {|g' abc.txt

详细信息

  • -r(或-E(选项启用POSIX ERE regex语法
  • (data)[[:space:]]*({)-将data匹配并捕获到组1中,[[:space:]]*匹配任何零个或多个空白,({){字符捕获到组2中
  • 1 = 2—替换为第1组值、空格、=、空格和第2组值

查看在线演示。

注意:如果需要确保图案与整条线匹配,请添加锚点^$:

's|^(data)[[:space:]]*({)$|1 = 2|g'

在GNU sed中,您可以使用[[:spaces:]]*s*的较短形式:

's|^(data)s*({)$|1 = 2|'

如果可能有前导/尾随空白,并且需要保持使用:

's|^(s*data)s*({s*)$|1 = 2|'

sed '/=/!s/data /&= /' abc.txt

在没有等号的行上,将data+空格替换为data+空格+equal+空格。

最新更新