sed 删除以 # 开头但不以 # 开头的行! (外壳脚本)

sed 删除以 # 开头但不以 # 开头的行! (外壳脚本)

要删除带有 的行#,可以使用以下行:

sed -i "/^\(\\s\)*\\#/d"

但我想要的是删除以 开头#而不是 开头的行#!

答案1

sed -i -e '/^\s*#\([^!]\|$\)/d'

在哪里:

  • ^行首
  • \s*零个或多个空白字符
  • #一个散列标记
  • \([^!]\|$\)后跟一个不是! 行尾的字符。

答案2

sed -i -e '/^#!/p' -e '/^#/d' file

这将逐行遍历文件,当它找到以其开头的行时,#!将由第一个表达式打印。然后它将被第二个表达式从模式空间中删除(即它不会被打印第二时间由默认p命令执行,该命令在不使用时有效sed -n)。

以 just 开头的行将#被第一个表达式忽略,但会被第二个表达式删除。

任何其他行将由默认p命令打印。

允许前面有空格#(并删除这些行):

sed -i -e '/^[[:blank:]]*#!/p' -e '/^[[:blank:]]*#/d' file

[[:blank:]]表达式将匹配空格或制表符。


正如 Stéphane 在注释中提到的那样,如果第一个表达式匹配,则在第一个表达式中更改p为将允许脚本继续下一行输入,而不考虑第二个表达式。该命令分支到预定义的标签,如果没有给出标签,则分支到脚本的末尾。这将是一种优化。bsedbsed

答案3

“和”两个地址,需要一个命令组({...;}):

sed '/^[[:space:]]*#/{/^#!/!d;}' < file

使用 GNU sed,您可以-i就地使用 for 、替换[[:space:]]\s(假设是最新版本)并省略;

sed -i '/^\s*#/{/^#!/!d}' file

您可以嵌套多个,但要注意可移植性,在}.因此对于A 和 B,而不是 C 和 D,那就是:

sed '/A/{/B/{/C/!{/D/!d;}' -e '}' -e '}' < file

或者:

sed '
  /A/{
    /B/{
      /C/!{
        /D/!d
      }
    }
  }' < file

答案4

摘要:删除所有非shebang评论。

sed -e '1{/^\s*\#/{/^\#!/!d}}' -e '1!{/^\s*\#/d}' file

您的命令修改为使用单引号(无双引号\\):

sed '/^\(\s\)*\#/d'

只需添加详细信息即可几乎正常工作(在 # 之后)必须有任何不是星号[^!] sed '/^\(\s\)*\#[^!]/d'. But that will fail with a line that is empty after the comment (#`)字符的内容。

为此,我们需要断言该行已结束 ( $)。

为此,我们需要使用扩展语法([^!]|$)

sed -E '/^\s*\#([^!]|$)/d'

或者,更便携:

sed -E '/^[ \t]*\#([^!]|$)/d'

然而,对于脚本来说,只有开头的第一行才#!重要。
所有其他以可选空格和 # 开头的行都是注释:

sed -e '1{/^#!/!d}' -e '1!{/^[ \t]*#/d}' file

意思是:

第一的-e

如果第一行以注释(空格和 #)开头,但不完全以 #!它被删除了。

第二-e

1!删除以可选空格和 # 开头的其他行 ( )。

相关内容