我有一个文本文件,如下所示:
#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“命令有什么问题?
我知道“*”表示“任何”,所以我认为“#*”表示"#“之后的字符串。
难到不是么?
发布于 2019-08-26 16:36:49
您可以使用
sed 's/#.*//;/^$/d' file > outfiles/#.*//将删除#和该行的所有其余部分,而/^$/d将删除空行。
s="#filelists.txt
a
# aaa
b
#bbb
c #ccc"
sed 's/#.*//;/^$/d' <<< "$s"输出:
a
b
c 另一个想法:匹配具有#的行,然后删除#和该行的其余部分,如果该行为空,则删除:
sed '/#/{s/#.*//;/^$/d}' file > outfile这样,您就可以保留原来的空行。
发布于 2019-08-26 16:36:07
*并不意味着“任何”(至少在正则表达式上下文中不是这样)。*的意思是“前一个模式元素中的零个或多个”。这意味着您正在删除“零个或多个#”。因为您只有一个#,所以您删除它,而该行的其余部分保持不变。
您需要s/#.*//:“删除#,后跟零个或多个任意字符”。
编辑:建议使用grep -v,但没有注意到第三个示例(行中间的#)。
https://stackoverflow.com/questions/57654362
复制相似问题