sed - 用字符替换括号?

时间:2016-03-23 01:38:35

标签: bash sed

我有一个字符串,括号中包含一个字符,如:

[a]

我想取括号中的字符并用字符替换括号,所以最终结果如下:

aaa

这是我提出的,但它不起作用:

sed 's/\[ \([a-z]\) \]/\2/g' < testfile

有人可以帮助我,解释为什么我的命令不起作用吗?

3 个答案:

答案 0 :(得分:0)

我认为你错过了一些基本概念。首先让我们复制一个char

$ echo a | sed -r 's/(.)/\1\1/' 
aa

括号表示组,\1表示第一组

现在,要匹配方括号中的字符并将其加倍。

$ echo [a]b | sed -r 's/\[(.)\]/\1\1\1/'
aaab

你需要转义方括号字符,因为它们在正则表达式中有特殊含义。关键是你必须在括号中括起你感兴趣的正则表达式,并用\{number}表示法以相同的顺序引用它们。

答案 1 :(得分:0)

您的模式sed 's/\[ \([a-z]\) \]/\2/g' < testfile的问题:

1) The pattern has only one group \([a-z]\), so \2 is invalid;
2) The pattern contains space, there is no match found;
3) To replace brackets, you need to capture them in a group.

我的想法是,捕获模式中的所有组,并将其替换为\2\2\2

echo "[a]" | sed 's/\(\[\)\([a-z]\)\(\]\)/\2\2\2/g'

或者

echo "[a]" | sed 's/\(.\)\(.\)\(.\)/\2\2\2/g'

输出结果为:

aaa

答案 2 :(得分:0)

请尝试以下代码:

$ echo "[a]" | sed 's/\[\([a-zA-Z]\)\]/\1\1\1/g'

$ echo "[a]" | sed -r 's/\[([a-zA-Z])\]/\1\1\1/g'

<强>输出:

aaa