如何解决以下问题?输入
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\)*
,也就是说,我们使用前面可选地带有的序列而不是a
or序列。b
b
a
答案2
简单的答案可能是:
sed 's/#[^#]*$//g'
它将匹配#
后跟一个或多个“not #
”字符,直到行尾。如果您追求的是更复杂的东西,那么值得对您所追求的具体内容进行一些扩展。