在匹配后将大括号添加到字符串 (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} ...

Obvisouly,sed替换部分中的&将是匹配的模式,但是,我希望&只是匹配模式之后的内容,我做错了什么?

我也尝试添加单词边界,[^ ]无济于事。我是不是太努力了sed?我应该使用允许回溯的语言吗?

感谢您的任何帮助!

试试这个:

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

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

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

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

{AAA,aa}
{BBB,bb}

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

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

遵循 sed 应该可以工作。

在 Linux 上:

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

或在 OSX 上:

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

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

最新更新