我有一个文本文件,如下所示:
#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”,所以我认为'#*'表示“#”之后的字符串。
不是吗?
答案 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
这样,您将保留原来的空行。
答案 1 :(得分:2)
*
并不意味着“任何”(至少在正则表达式上下文中不是)。 *
表示“零个或多个先前的模式元素”。这意味着您要删除“零个或多个#
”。由于您只有一个#
,因此将其删除,其余的行则保持不变。
您需要s/#.*//
:“删除#
,后接零个或多个字符”。
编辑:建议使用grep -v
,但没有注意到第三个示例(行中间的#
)。