首页 > 解决方案 > sed 中的正则表达式仅从每行中删除第一次出现

问题描述

我有以下文件要清理

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 似乎没有正确支持正则表达式

标签: regexbashsednon-greedy

解决方案


perl这里应该更合适,因为我们这里需要惰性匹配逻辑。

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

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


推荐阅读