[英]regex in sed removing only the first occurrence from every line
我有以下文件要清理
cat file.txt
MNS:N+ GYPA*01 or GYPA*M
MNS:M+ GYPA*02 or GYPA*N
MNS:Mc GYPA*08 or GYP*Mc
MNS:Vw GYPA*09 or GYPA*Vw
MNS:Mg GYPA*11 or GYPA*Mg
MNS:Vr GYPA*12 or GYPA*Vr
我想要的输出是:
MNS:N+ GYPA*01 or GYPA*M
MNS:M+ GYPA*02 or GYPA*N
MNS:Mc GYPA*08 or GYP*Mc
MNS:Vw GYPA*09 or GYPA*Vw
MNS:Mg GYPA*11 or GYPA*Mg
MNS:Vr GYPA*12 or GYPA*Vr
我想删除“:”和第一次出现的“或”之间的所有内容
我试过sed 's/MNS:d*?or /MNS:/g'
虽然它也删除了第二个“或”。
我尝试了https://www.geeksforgeeks.org/sed-command-in-linux-unix-with-examples/ 中的每个选项
无济于事。 我应该创建alias sed='perl -pe'
吗? 似乎 sed 没有正确支持正则表达式
perl
应该更适合这里,因为我们在这里需要延迟匹配逻辑。
perl -pe 's|(:.*?or +)(.*)|:\2|' Input_file
通过使用.*?or
我们正在检查行中的第一个最接近的匹配或字符串。
这可能对你有用(GNU sed):
sed '/:.*\<or\>/{s/\<or\>/\n/;s/:.*\n//}' file
如果一行包含:
后跟单词or
,则用唯一的分隔符(例如\\n
)替换第一次出现的单词or
,然后删除:
和唯一分隔符之间的所有内容。
I would like to remove everything between ":" and the first occurence of "or"
- 不,你不会。 样本输入的第 2 行中第一次出现or
是作为orweqqwe
的开始。 紧随其后的那个文本:
看起来可能是任何字符集,所以它不能包含一个独立的or
,例如MNS:2 or eqqwe or M+ GYPA*02 or GYPA*N
鉴于这一点以及显然每行要删除固定数量的字符这一事实,似乎这才是您真正应该使用的:
$ sed 's/:.\{14\}/:/' file
MNS:N+ GYPA*01 or GYPA*M
MNS:M+ GYPA*02 or GYPA*N
MNS:Mc GYPA*08 or GYP*Mc
MNS:Vw GYPA*09 or GYPA*Vw
MNS:Mg GYPA*11 or GYPA*Mg
MNS:Vr GYPA*12 or GYPA*Vr
如果确定or
总是按照提供的示例在一行中出现两次,请尝试:
sed 's/\(MNS:\).\+ or \(.\+ or .*\)/\1\2/' file.txt
结果:
MNS:N+ GYPA*01 or GYPA*M
MNS:M+ GYPA*02 or GYPA*N
MNS:Mc GYPA*08 or GYP*Mc
MNS:Vw GYPA*09 or GYPA*Vw
MNS:Mg GYPA*11 or GYPA*Mg
MNS:Vr GYPA*12 or GYPA*Vr
否则使用perl
是一个更好的解决方案,它支持shortest match
作为 RavinderSingh13 答案。
ex
支持与\\{-}
延迟匹配:
ex -s '+%s/:\zs.\{-}or //g|wq' input_file
模式:\\zs.\\{-}or
匹配第一个:
到第一个or
之后的任何字符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.