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 不匹配反斜杠文字还是我做错了啥?的主要内容,如果未能解决你的问题,请参考以下文章