我是正则表达式的初学者,我正在努力实现一些相对简单的事情:
我有一个像这样安排的数据集:
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的语言吗?
感谢您的帮助!
答案 0 :(得分:1)
您的正则表达式中始终可以有多个捕获组,以捕获不同的部分。您甚至可以在第一个捕获组中移动[:punct:]
部分:
sed 's/((?:AAA|BBB)[[:punct:]])([[:alnum:]]+)/\1{\3}/g' dataset.txt
我不明白.
和[:punct:]
之间的[:alnum:]
是做什么的。所以,我删除了它。因此,您可能已经注意到,正则表达式符合以下模式:
{AAA,aa}
{BBB,bb}
,即AAA
和BBB
之后仅匹配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