我正在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;'
仍然没有得到改变的结果。
答案 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