pax*_*blo 33
如果你担心sed
在管道中启动两个进程而不是一个进程,你可能不应该这样做,这并不是那么低效.
但是,如果您确实需要单个进程,则可以使用多个-e
参数,例如:
sed -e 's/#.*$//' -e '/^$/d' inputFile
Run Code Online (Sandbox Code Playgroud)
为了回应您对单个进程的原因的评论,想要sed -i
用于就地编辑,您仍然可以按照以下记录执行此操作:
pax> echo 'Line # with a comment' >qq
pax> echo >>qq
pax> echo '# Line with only a comment' >>qq
pax> cat qq
Line # with a comment
# Line with only a comment
pax> sed -i -e 's/#.*$//' -e '/^$/d' qq
pax> cat qq
Line
pax> _
Run Code Online (Sandbox Code Playgroud)
请注意即使有两个-e
选项,文件如何就地修改.您可以看到两条命令都在每一行上执行.带注释的行首先删除了注释,然后删除所有注释,因为它是空的.
此外,原始空行也被删除.
Chr*_*son 13
@paxdiablo有一个很好的答案,但它可以改进.
(1)该'/^$/d'
条款仅匹配100%的空白行.
如果你想匹配完全空白的行(空格,制表符等),请改用:
'/^\s*$/d'
Run Code Online (Sandbox Code Playgroud)
(2)该's/#.*$//'
子句仅匹配以第#
0列中的字符开头的行.
如果你想在第一次#
使用之前匹配只有空格的行:
'/^\s*#.*$/d'
Run Code Online (Sandbox Code Playgroud)
上述标准可能不是通用的(例如,在HEREDOC块内,或者在Python多行字符串中,不同的方法可能很重要),但在许多情况下,"空白"行的常规定义仅包括空格,并且"注释"行包括空格 - 然后 - #
.
(3)最后,至少在OSX上,@ paxdiablo解决方案,其中第一个子句将注释行转换为空行,第二个子句剥离空行(包括最初的注释)不起作用.似乎更容易使两个子句/d
删除操作,就像我已经完成的那样.
包含上述内容的修订命令是:
sed -e '/^\s*#.*$/d' -e '/^\s*$/d' inputFile
Run Code Online (Sandbox Code Playgroud)
这个小宝石会删除所有#评论,无论它们从哪一行开始:
sed -e 's/\s*#.*$//'
Run Code Online (Sandbox Code Playgroud)
例:
text="
this is a # test
#this is a test
#this is a #test
this is # another #test
"
$echo "$text" | sed -e 's/\s*#.*$//'
this is a
this is
Run Code Online (Sandbox Code Playgroud)
接下来,这将删除任何结果空行:
$echo "$text" | sed -e 's/\s*#.*$//' | sed -e '/^\s*$/d'
Run Code Online (Sandbox Code Playgroud)