重击:如果只有字母,如何仅替换方括号之间的内容

时间:2018-11-30 10:28:21

标签: bash macos sed

让我说这行:

Centrino Advanced-N 6205 [Taylor Peak] [0085]

我想将其更改为:

Centrino Advanced-N 6205 (Taylor Peak) [0085]

当方括号之间有字母和空格时,将方括号从[]更改为()仅 的最佳方法是什么?

[]和数字应保持不变。

2 个答案:

答案 0 :(得分:1)

sed在这里工作正常。

line="Centrino Advanced-N 6205 [Taylor Peak] [0085]"
echo $line | sed -E 's/\[([A-Za-z ]+)\]/(\1)/g'

-E标志打开扩展的正则表达式(允许(...)捕获组工作而不会与+一起转义黑色斜线以匹配一个或多个匹配项)。

[A-Za-z ]仅匹配字母和空格,因此不会匹配带有数字的括号(或与此相关的任何其他类型的内容)。

答案 1 :(得分:1)

echo 'Centrino Advanced-N 6205 [Taylor Peak] [0085]' | sed 's/\[\([a-zA-Z ]\+\)\]/\(\1\)/g'

正则表达式搜索大写和小写字母a到z以及矩形括号之间的空格。

此字母范围和空格用[a-zA-Z ]\+描述。 \+意味着至少需要发生一次。

围绕\(\)。这意味着,存储在\1中找到的内容,该内容用于s(earch)/look_for_this/replace_with_that/g(lobally)的“替换为”部分。

最后,正则表达式由最外面的\[\]完成。这些括号需要转义,以免与已经提到的字符范围混淆。


或者您像在TrebuchetMS的答案中那样做,并为自己节省了一些转义。尽管由于解释而将其留在这里。 :)