如何在 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
我正在使用 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