Regex 正则表达式删除注释,但不删除shebang

Regex 正则表达式删除注释,但不删除shebang,regex,linux,bash,Regex,Linux,Bash,我得到了一个正则表达式,它使用这个正则表达式代码删除bash中的注释 '/^\#/d' 但它也会删除#!这不应该是因为它不是一个注释标签,而是一个shebang 那么,如何才能忽视#!用正则表达式 这一行将删除所有以#开头的注释,但后面不跟一个 '/^#[^!]/d' 此行将删除以#开头的所有注释,但后面不跟一个 '/^#[^!]/d' 这使得可选 '/^#[^!]*/d' 这使得可选 '/^#[^!]*/d' 试试这个: awk '/^$/ || (NR == 1 &&

我得到了一个正则表达式,它使用这个正则表达式代码删除bash中的注释

'/^\#/d'
但它也会删除#!这不应该是因为它不是一个注释标签,而是一个shebang


那么,如何才能忽视#!用正则表达式

这一行将删除所有以#开头的注释,但后面不跟一个

'/^#[^!]/d'

此行将删除以#开头的所有注释,但后面不跟一个

'/^#[^!]/d'

这使得
可选

'/^#[^!]*/d'

这使得
可选

'/^#[^!]*/d'
试试这个:

awk '/^$/ || (NR == 1 && /^#!/) || /^[^#]/'
这与以下行匹配:

  • 都是空的,或者
  • 是第一行,以hashbang开头,或者
  • 以不是散列的字符开头
匹配的行被打印出来。

请尝试以下操作:

awk '/^$/ || (NR == 1 && /^#!/) || /^[^#]/'
这与以下行匹配:

  • 都是空的,或者
  • 是第一行,以hashbang开头,或者
  • 以不是散列的字符开头
匹配的行被打印出来。

^\#[^!]
不太正确,因为它需要任何非
字符位于
#
之后,因此它不会删除仅为
#
且后面没有任何内容的行。我不知道您使用的是什么风格的正则表达式,因此语法可能会有所不同,但您正在寻找:
^(?!!)
。另外,
\
字符根本不需要用
\
转义。

^\\\[^!]
不太正确,因为它需要任何非
字符位于
#
之后,因此它不会删除仅为
#
且后面没有任何内容的行。我不知道您使用的是什么风格的正则表达式,因此语法可能会有所不同,但您正在寻找:
^(?!!)
。另外,
\
字符根本不需要用
\
转义。

这对我很有用:

/^(#[^!]|#$)/d
其中,
|#$
是匹配单个哈希行特殊情况的加法。例如:

cat commented.sh | sed '/^\(#[^!]\|#$\)/d' 
这对我很有用:

/^(#[^!]|#$)/d
其中,
|#$
是匹配单个哈希行特殊情况的加法。例如:

cat commented.sh | sed '/^\(#[^!]\|#$\)/d' 

您是否尝试过
'/^\#^[!]/d'/
?抱歉,我现在无法尝试自己…你使用的是哪种正则表达式风格?你说的风格是什么意思?@Axel它根本不会删除任何注释是的,我错放了
^
…你试过
'/^\#^[!]/d'/
?抱歉,我现在不能亲自尝试…你使用的是哪种正则表达式风格?你说的风格是什么意思?@Axel它根本不会删除任何注释是的,我错放了
^
…我找到了。只要去掉上面的*就可以了。所以它应该是'/^.[^!]/d'我明白了。只要去掉上面的*就可以了。所以应该是“/^#[^!]/d’我已经知道了,但我会把你的答案作为正确答案,因为你也知道了。这不会删除空的评论行,例如只有一行
。我已经知道了,但我会把你的答案作为正确答案,因为你也知道了。这不会删除空的评论行,例如只有一行
#
。你不是忘了
.*
后面的
.
?我用
sed-I'/^\s*\(#[^!].\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\$\)/d'注释。sh
你没有忘记
.
后面的
.
?我使用
sed-I'/^\s*\(#[^!].\|$\)/d'注释。sh