正则表达式-Linux-之间,但不包括

时间:2019-02-20 15:48:15

标签: regex linux

我正在Linux(CentOS)上,并且试图从类似的东西中捕获

 This, formatting | is, 123gh234ee2, {absolutely}, [ positively | obnoxious | in ], {every}, [ {single} | {way} ],, Thanks | For your | Help!

我要替换所有管道|,但只替换[]内的那些管道。所以...

 This, formatting | is, 123gh234ee2, {absolutely}, [ positively ; obnoxious ; in ], {every}, [ {single} ; {way} ],, Thanks | For your | Help!

我尝试了几种表达式,但是我认为应该起作用的一种表达式却没有。谁能解释为什么?

sed -i 's/(?<=\[)(\|)(?=\])/;/g' 'myFile.txt'

我的想法是对[with

(?<=\[)

使用

(?=\])

并使用

捕获管道
(\|)

但是我的文件中没有任何变化,而且我似乎真的无法将手指放在哪里出了问题。

谢谢!

为澄清起见,我还尝试了perl方法

cat '/myFile.txt' | perl -ne 's/(?<=\[)(\|)(?=\])/xxxxx/g; print;'

仍然没有得到改变的结果。

1 个答案:

答案 0 :(得分:0)

您的lookbehind和lookahead正则表达式正试图匹配单个字符。如果您输入的文本恰好包含[|],它们可能会起作用。

从理论上讲,您希望后面的外观类似于(?<=\[.*),但实际情况是,大多数引擎不处理任意长度的回溯。

您可以使用sed {command ; block }来实现循环,一次将行的各个段追加到内部缓冲区中一次,然后在匹配停止后发出整个行。

IMO是一个更好的主意,那就是切换到一种语言,该语言可以让您使用方括号来分隔文本。

例如,您可以使用awk,perl或python来获取[]之间的文本,然后分别进行处理。这些不是正则表达式,而是小脚本。

最后,另一个选择可能是先用特殊标签替换左方括号,然后右方括号添加换行符:

sed -e 's/\[/\n@[/g' -e 's/]/]\n/g'

这会将您放在方括号中的文本放在自己的行上,因此您可以通过以下方式进行此操作:对模式进行全行替换:

sed -e '/^@\[/s/\|/;/g' # On lines starting with @[ replace | with ;

现在您必须将线重新粘在一起,您可以找到here