首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用sed删除'#‘后的字符串

问使用sed删除'#‘后的字符串
EN

Stack Overflow用户
提问于 2019-08-26 16:30:33
回答 2查看 154关注 0票数 2

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

代码语言:javascript
复制
#filelists.txt
a
# aaa
b
#bbb
c #ccc

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

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

代码语言:javascript
复制
sed -e "s/#*//g" -e "/^$/d" filelists.txt

我希望其结果是:

代码语言:javascript
复制
a
b
c

但实际结果是:

代码语言:javascript
复制
filelists.txt
a
 aaa
b
bbb
c ccc

我的"sed“命令有什么问题?

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

难到不是么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-26 16:36:49

您可以使用

代码语言:javascript
复制
sed 's/#.*//;/^$/d' file > outfile

s/#.*//将删除#和该行的所有其余部分,而/^$/d将删除空行。

查看online test

代码语言:javascript
复制
s="#filelists.txt
a
# aaa
b
#bbb
c #ccc"

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

输出:

代码语言:javascript
复制
a
b
c 

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

代码语言:javascript
复制
sed '/#/{s/#.*//;/^$/d}' file > outfile

参见another online demo。

这样,您就可以保留原来的空行。

票数 3
EN

Stack Overflow用户

发布于 2019-08-26 16:36:07

*并不意味着“任何”(至少在正则表达式上下文中不是这样)。*的意思是“前一个模式元素中的零个或多个”。这意味着您正在删除“零个或多个#”。因为您只有一个#,所以您删除它,而该行的其余部分保持不变。

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57654362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档