Sed 不匹配反斜杠文字还是我做错了啥?

Posted

技术标签:

【中文标题】Sed 不匹配反斜杠文字还是我做错了啥?【英文标题】:Sed is not matching a backslash literal or am I doing something wrong?Sed 不匹配反斜杠文字还是我做错了什么? 【发布时间】:2021-10-06 20:05:34 【问题描述】:

我有一个包含 3 行的文件:

%fddfdffd
\%dffdfd
hello %12345678

我需要删除“%”字符之后的任何内容(包括“%”字符),但如果“%”以“\”开头,则不需要。

我试过了,但没用:

sed -i "s/[^\\]%.*//g"

该任务实际上是在处理一个乳胶文件以使用 sed

删除 cmets

使用sed后的文件应该是:

\%dffdfd
hello 

【问题讨论】:

如果该行包含\\%会发生什么? @choroba 它不应该被删除。 失败的原因是符号[^\\]% 需要在% 之前有一个字符,而不是``。 【参考方案1】:

我建议你的三个案例:

sed '/^%/d; /\\%/b; s/%.*//' file

输出:

\%dffdfd 你好

见:man sed

【讨论】:

这似乎合乎逻辑; (1)它是否以百分比开头,删除(2)它是否包含\% 跳转到脚本的末尾并且什么都不做(3)如果我们到达这一点,从百分比开始删除所有内容......这非常干净简单。有一些未解决的附带案例,但我相信这涵盖了超过 99.9% 的案例! 侧例示例:This line has a % commented out \%-character @kvantour:是的,它涵盖了指定的情况。【参考方案2】:

这可能对你有用(GNU sed):

sed -E 's/(^|[^\])%.*/\1/' file

如果该行以%% 开头,后跟\ 以外的任何字符,请删除该行的其余部分。

如果因此该行为空并且也将被删除,请使用:

sed -E '/^%/d;s/([^\])%.*/\1/' file

【讨论】:

【参考方案3】:

这也应该有效。

sed -i 's/^%[^"]*//;s/%[0-9]*$//'

【讨论】:

以上是关于Sed 不匹配反斜杠文字还是我做错了啥?的主要内容,如果未能解决你的问题,请参考以下文章

使用 sed [重复] 替换包含反斜杠的字符串

sed命令反斜杠的转义

sed:反斜杠怎么办? [复制]

当下一个字符为“t”时,使用sed命令转义反斜杠

正则表达式匹配一美元,前面没有反斜杠

在数据库中,文件路径应该存储斜杠/,还是反斜杠呢?