要删除带有 的行#
,可以使用以下行:
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
为将允许脚本继续下一行输入,而不考虑第二个表达式。该命令分支到预定义的标签,如果没有给出标签,则分支到脚本的末尾。这将是一种优化。b
sed
b
sed
答案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!
删除以可选空格和 # 开头的其他行 ( )。