繁体   English   中英

sed 中的正则表达式仅从每一行中删除第一次出现

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM