使用sed删除'#'之后的字符串

时间:2019-08-26 08:30:32

标签: sed

我有一个文本文件,如下所示:

#filelists.txt
a
# aaa
b
#bbb
c #ccc

我想删除以'#'开头的部分行,然后,如果行以#开头,则要删除整行。

所以我在shell中使用了'sed'命令:

sed -e "s/#*//g" -e "/^$/d" filelists.txt

我希望它的结果是:

a
b
c

但实际结果是:

filelists.txt
a
 aaa
b
bbb
c ccc

我的“ sed”命令出了什么问题?

我知道'*'表示“ any”,所以我认为'#*'表示“#”之后的字符串。

不是吗?

2 个答案:

答案 0 :(得分:3)

您可以使用

sed 's/#.*//;/^$/d' file > outfile

s/#.*//删除了#,其余所有行和/^$/d删除了空行。

查看online test

s="#filelists.txt
a
# aaa
b
#bbb
c #ccc"

sed 's/#.*//;/^$/d' <<< "$s"

输出:

a
b
c 

另一个想法:匹配具有#的行,然后删除#和该行的其余部分,如果该行为空,则删除该行:

sed '/#/{s/#.*//;/^$/d}' file > outfile

请参见another online demo

这样,您将保留原来的空行。

答案 1 :(得分:2)

*并不意味着“任何”(至少在正则表达式上下文中不是)。 *表示“零个或多个先前的模式元素”。这意味着您要删除“零个或多个#”。由于您只有一个#,因此将其删除,其余的行则保持不变。

您需要s/#.*//:“删除#,后接零个或多个字符”。

编辑:建议使用grep -v,但没有注意到第三个示例(行中间的#)。