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

我想删除“:”和第一次出现的 "or"

之间的所有内容

我试过 sed 's/MNS:d*?or /MNS:/g' 虽然它也删除了第二个 "or"。

我尝试了 https://www.geeksforgeeks.org/sed-command-in-linux-unix-with-examples/

中的每个选项

无济于事。我应该创建 alias sed='perl -pe' 吗?似乎 sed 没有正确支持 regex

perl应该更适合这里因为我们这里需要Lazy match逻辑

perl -pe 's|(:.*?or +)(.*)|:|' Input_file

通过使用 .*?or,我们正在检查行中第一个最接近的匹配项或字符串。

如果确定 or 总是像提供的示例一样在一行中出现两次,请尝试:

sed 's/\(MNS:\).\+ or \(.\+ or .*\)//' 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 之后的任何字符。

这可能适合您 (GNU sed):

sed '/:.*\<or\>/{s/\<or\>/\n/;s/:.*\n//}' file

如果一行包含 : 后跟单词 or,则用唯一的分隔符(例如 \n)替换第一次出现的单词 or,并且然后删除 : 和唯一分隔符之间的所有内容。

Wrt 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