Sed 删除text1和(text2或行尾)之间的所有字符

Sed 删除text1和(text2或行尾)之间的所有字符,sed,Sed,第1行:StartHere单词1 EndHere 第2行:StartHere Word2 应该是 第1行:StartHereEndHere 第2行:StartHere 正如您在本例中所看到的,我们并不总是有“EndHere”,有时它将是行的结尾,我正在使用sed(我想sed非常讨厌“\n”) 这一条适用于第一行。 那么我应该如何治疗第二个病例呢? Ps:我正在处理一个文件。您可以使用支持的Perl来完成,而不是使用sed 使用您在评论中给出的示例: $ echo "oooo Start

第1行:
StartHere单词1 EndHere

第2行:
StartHere Word2

应该是

第1行:
StartHereEndHere

第2行:
StartHere

正如您在本例中所看到的,我们并不总是有“EndHere”,有时它将是行的结尾,我正在使用sed(我想sed非常讨厌“\n”)

这一条适用于第一行。 那么我应该如何治疗第二个病例呢?
Ps:我正在处理一个文件。

您可以使用支持的Perl来完成,而不是使用
sed

使用您在评论中给出的示例:

$ echo "oooo StartHere=Yo9897 EndHereYo" \
  | perl -pe 's/(StartHere) (?: .*(EndHere) | .*(?!EndHere) )/$1$2/x'
将输出“oooo STARTHERENDHEREYO”

(?!…)
是一种“消极前瞻”


Perl的
x
regex选项允许在regex中使用空格,使其(稍微)更具可读性

sed 's/EndHere/&\n/g; s/\(StartHere\)[^\n]*\(EndHere\|$\)/\1\2/g; s/\n//g' <<EOF
StartHere Word1 EndHere
StartHere Word2
StartHere Word2 EndHere something else
something else StartHere Word2 EndHere something else
EOF

在这里,我确信我删除的单词每行只有一次

然后你可以:

sed 's/\(StartHere\).*\(EndHere\)/\1\2/; t; s/\(StartHere\).*$/\1/'

如果最后一个
s
命令成功,则
t
命令将结束当前行的处理。所以它会起作用。

请您发布更清晰的输入和预期输出示例。bla_bla和xxx的提及不会让我们清楚地了解您的实际需求,所以请编辑您的问题,然后让我们知道。这是一个贪婪的删除吗?例如,如果您有一行
abc Start efg Start klm End pqr End rst
,该怎么办。你想要哪个结果?(1)
abc StartEnd rst
(2)
abc Start efg StartEnd rst
(3)
abc StartEnd pqr End rst
(4)
abc Start efg StartEnd pqr End rst
我确信在这里我删除的单词每行只有一次。我只想找到一种方法来检测“EndHere”单词或行尾,这样我就不会最终删除“EndHere”不起作用:echo“oooo StartHere=Yo9897 EndHereYo”| sed-E的/(StartHere)。*?(EndHere |$)/\1\2/'==>ooooStartHere@aminezawix:您的意思是您还想删除“StartHere”之前的任何内容吗?如果是,请在正则表达式的开头添加
*?
。但是如果您还想删除“EndHere”之后的任何内容,您可能确实需要2个正则表达式。@aminezawix:或者使用Perl而不是
sed
。参见修改后的答案。
非贪婪匹配
Och,我认为在sed中这是不可能的(很容易:p)。我想没有<代码>sed-E的/(StartHere)。*?(EndHere |$)/“@KamilCuk:不完全是。sed还删除了“EndHere”,如果它后面跟着什么。所以我更喜欢去掉一半的溶液。
StartHereEndHere
StartHere
StartHereEndHere something else
something else StartHereEndHere something else
sed 's/\(StartHere\).*\(EndHere\)/\1\2/; t; s/\(StartHere\).*$/\1/'