【问题标题】:Regular expression - skip string in quotes using sed正则表达式 - 使用 sed 跳过引号中的字符串
【发布时间】:2011-03-16 08:50:22
【问题描述】:

我有这样的字符串:

"一些标准文本 CONST_INSIDE_QUOTES" blah blah CONST "可能还有其他引号"

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

sed "s/([A-Z][A-Z0-9_]*)([^a-z])/\1\2/g"

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

【问题讨论】:

  • 请提供您想要的输出,并在您的示例输入中包含逗号,否则会导致问题
  • "一些标准文本 CONST_INSIDE_COMMAS" blah blah CONST "可能还有另一个逗号"
  • 我不完全理解你所说的constants inside text in commas 是什么意思,因为 sed 命令必须处理这些逗号,如果你真的提供了一个真实世界,我们为你提供答案会更有帮助使用您想要的输出示例而不是使用伪代码。
  • read(3, "ogpid=30589 0 0\nFIK/XBRADA08.STU"..., 1024) 我想编辑我的正则表达式,使其不适用于 FIK、XBRADA08 和 STU
  • “逗号”我假设你的意思是引号? IE。逗号是 this: ,而引号是 this: "

标签: regex sed


【解决方案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"

【讨论】:

  • Awk 真的是实现这一目标的唯一方法吗?
  • 当然不是only的方式,perl、python、php、ruby等其他全功能语言也可以做到;虽然我认为 awk(也许还有 perl)会做得最好。
  • 当然,但我不能使用那些语言,它是一个 bash 脚本,应该只使用基本工具...我会用 awk 试试。谢谢。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2018-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    • 1970-01-01
    相关资源
    最近更新 更多