正则表达式 - 使用sed跳过引号中的字符串

时间:2011-03-15 23:24:14

标签: regex sed

我有这样的字符串:

  

“一些标准文本CONST_INSIDE_QUOTES”blah blah CONST“可能还有其他引用”

问题是,我想用一些文本替换字符串中的所有常量,但它不能应用于引号中文本内的常量。我有这个正则表达式:

  

sed“s /([AZ] [A-Z0-9 _] *)([^ az])/< span class = \”const \“> \ 1< \ / span> \ 2 / g “

当然适用于所有的景点。任何想法如何排除它适用于引号常量?不幸的是只有sed ......

2 个答案:

答案 0 :(得分:1)

好吧,它并不漂亮,但只要你有嵌套引号就行。

也就是说:

blah "foo" blah "bar" 确定
"blah "foo" blah "bar" blah" 不行

它使用双引号作为字段分隔符,然后仅对奇数字段(通过%运算符)起作用以进行替换。当具有嵌套引号时,这基本上解决了平衡括号问题。

awk -F'"' '{
  for(i=1;i<NF;i++)
    if(i%2)
    $i=gensub(/([[:upper:]][[:upper:][:digit:]_]*)/,"<span class=\"const\">\\1</span>","g",$i)
}1' OFS='"'

概念证明

$ echo 'read(3, "ogpid=30589 0 0\nFIK/XBRADA08.STU"..., 1024); blah blah C3434ONST "some other text"'  | awk -F'"' '{for(i=1;i<NF;i++)if(i%2)$i=gensub(/([[:upper:]][[:upper:][:digit:]_]*)/,"<span class=\"const\">\\1</span>","g",$i)}1' OFS='"'
read(3, "ogpid=30589 0 0\nFIK/XBRADA08.STU"..., 1024); blah blah <span class="const">C3434ONST</span> "some other text"

答案 1 :(得分:0)

正则表达式的一个众所周知的问题是匹配balanced parentheses,这相当于您在匹配平衡引号时遇到的问题(您在问题中称为逗号)。

你想要知道正则表达式中常量之前有零或偶数引号。不幸的是,正则表达式并不是以这种方式计算字符数。有关详细信息,请参阅this question的答案。