如何在 bash 中的任意数量的白色 space 之后搜索和替换字符串?

How do I search and replace a string after an arbitrary amount of white space in bash?

我正在使用 bash shell。我有一个仅包含行

的文本文件
name           "Test Program"

我想在名称后的字符串周围添加大括号,使文件看起来像

name           { “Test Program" }

我尝试了下面的表达式

perl -pi -e 's/name(\s+)"(.*)"/name{ "" }/g' /tmp/test.txt

但最终得到的文件只包含

name           

我是不是对任意白色 space (\s) 或替代有什么误解?

假设只有一对双引号,并且不限于 perl 解决方案 ...

一个想法使用 sed:

sed -E 's/("[^"]*")/{  }/' test.txt

其中:

  • -E - 启用扩展正则表达式(和捕获组)
  • ("[^"]*") -(捕获组)匹配一个 " + 0 个或更多 non-" 个字符 + "
  • { } - 将匹配替换为 { + 捕获组 + }

这会生成:

name           { "Test Program" }

一旦满意结果是正确的,您可以添加 -i 标志以对源文件进行更改,例如:

$ cat test.txt
name           "Test Program"

$ sed -Ei 's/("[^"]*")/{  }/' test.txt

$ cat test.txt
name           { "Test Program" }

假设我们需要验证 name 字符串的匹配...

sed -E 's/([[:space:]]*name[[:space:]]+)("[^"]*")/{  }/' test.txt

其中:

  • ([[:space:]]*name[[:space:]]+) -(第一​​个捕获组)是 0 个或更多个空格 + name + 1 个或更多个空格
  • ("[^"]*") -(第二个捕获组)与之前的解释相同
  • { } - 第一个捕获组 + { + 第二个捕获组 + }

示例数据文件:

$ cat test.txt
name           "Test Program"
  name         "Test Program"
boat           "Test Program"
names          "Test Program"

$ sed -E 's/([[:space:]]*name[[:space:]]+)("[^"]*")/{  }/' test.txt
name           { "Test Program" }
  name         { "Test Program" }
boat           "Test Program"
names          "Test Program"

尝试使用 sed:

cat test.txt | sed 's/^name[ ]\+/name       { /g' | sed 's/["][ ]*$/" }/g'

您可以使用这个 perl 命令:

perl -i -pe 's/(name\s+)("[^"]+")/ {  }/' file

cat file

name            { "Test Program" }

或者这个sed:

sed -i.bak -E 's/(name[[:blank:]]+)("[^"]+")/ {  }/' file
perl -pi -e 's/name(\s+)"(.*)"/name{ "" }/g' /tmp/test.txt

在这里,{ "" } 被解释为“%1 散列的 </code> 键”。</p> <p>用大括号括起 <code> 变量以消除扩展的歧义:

perl -pi -e 's/name(\s+)"(.*)"/name{ "" }/g' /tmp/test.txt
# ..................................^.^

或者转义左大括号

perl -pi -e 's/name(\s+)"(.*)"/name\{ "" }/g' /tmp/test.txt
# ...................................^

或者,使用 \K 运算符

perl -pi e 's/name\s+\K(".*")/{  }/' test.txt