我是正则表达式的初学者,我正在尝试实现一些相对简单的东西:
我有一个像这样排列的数据集:
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}
即,它在 AAA
和 BBB
之后仅匹配 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
用于内联选项,用于将更改保存在输入文件本身中。