匹配后将花括号添加到字符串(sed)

时间:2013-10-04 07:16:15

标签: regex bash command-line sed

我是正则表达式的初学者,我正在努力实现一些相对简单的事情:

我有一个像这样安排的数据集:

1,AAA,aaaa,BBB,bbbbbb ...
2,AAA,aaaaaaa,BBB,bbb ...
3,AAA,aaaaa,BBB,bb ...

我正在考虑在AAA或BBB之后将大括号添加到各种长度的字符串(字母数字字符)中(这些是常量):

1,AAA,{aaaa},BBB,{bbbbbb} ...
2,AAA,{aaaaaaa},BBB,{bbb} ...
3,AAA,{aaaaa},BBB,{bb} ...

所以我用sed尝试过这种方式:

sed 's/(AAA|BBB)[[:punct:]].[[:alnum:]]/\1{&}/g' dataset.txt

但是我得到了这个结果:

1,AAA,{AAA,aa}aa,BBB,{BBB,bb}bbbb, ... 
2,AAA,{AAA,aa}aaaaa,BBB,[BBB,bb}b, ...
3,AAA,{AAA,aa}aaa,BBB,{BBB,bb} ...

很明显,&的替换部分中的sed将成为匹配的模式,但是,我希望&只是匹配模式之后的内容,我做错了吗?

我还尝试在[^ ]之后添加单词边界无效。我用sed努力了吗?我应该使用允许lookbehind的语言吗?

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

您的正则表达式中始终可以有多个捕获组,以捕获不同的部分。您甚至可以在第一个捕获组中移动[:punct:]部分:

sed 's/((?:AAA|BBB)[[:punct:]])([[:alnum:]]+)/\1{\3}/g' dataset.txt

我不明白.[:punct:]之间的[:alnum:]是做什么的。所以,我删除了它。因此,您可能已经注意到,正则表达式符合以下模式:

{AAA,aa}
{BBB,bb}

,即AAABBB之后仅匹配2个字符。一个用于.,一个用于[[:alnum:]]

要匹配,到下一个,之后的所有字母数字字符,您需要使用量词:[[:alnum:]]+

答案 1 :(得分:1)

以下sed应该有效。

在Linux上:

sed -i.bak -r 's/((AAA|BBB)[[:punct:]])([[:alnum:]]+)/\1{\3}/g'

在OSX上的OR:

sed -i.bak -E 's/((AAA|BBB)[[:punct:]])([[:alnum:]]+)/\1{\3}/g'

-i用于内联选项,用于保存输入文件本身的更改。

答案 2 :(得分:1)

试试这个:

sed 's/\(AAA\|BBB\),\([^,]*\)/\1,{\2}/g' dataset.txt