删除 #xxx 注释,除非它们出现在 sed 中的引号内

删除 #xxx 注释,除非它们出现在 sed 中的引号内

如何解决以下问题?输入

hai this is "#test" #this is comment

问题:如何只删除shell脚本中的注释。预期输出:

hai this is "#test"

答案1

使用 GNU 或 FreeBSD sed

$ sed -E 's/^(([^"#]|"(\\.|[^\\"])*")*)#.*/\1/' << EOF
heredoc> hi this is "#test" #this is comment
heredoc> this is test # comment with # characters
heredoc> hi this is "\"test" #this is comment as " was escaped earlier
heredoc> EOF
hi this is "#test"
this is test
hi this is "\"test"

这个想法是匹配#.*遵循以下任一序列的:

  • "#( [^"#"])以外的字符
  • "..."带引号的字符串,...其中是以下任一序列:
    • \x: 反斜杠后跟任何字符 ( \\.)
    • "或除或以外的字符\

POSIXly(没有交替|) 操作员 (然而)),你可以这样写:

sed 's/^\(\(\("\(\(\\.\)\{0,1\}[^\"]\)*"\)\{0,1\}[^"#]\)*\)#.*/\1/'

(a|b)*在那里,我们使用BRE 代替ERE \(a\{0,1\}b\)*,也就是说,我们使用前面可选地带有的序列而不是aor序列。bba

答案2

简单的答案可能是:

sed 's/#[^#]*$//g'

它将匹配#后跟一个或多个“not #”字符,直到行尾。如果您追求的是更复杂的东西,那么值得对您所追求的具体内容进行一些扩展。

相关内容