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
我有以下文件要清理
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