如何用sed删除StartHere到EndHere或行尾间的所有字符?
解决sed匹配两种场景的问题
我来帮你搞定这个sed的匹配问题~你的初始命令只能处理包含EndHere的行,要同时覆盖「有EndHere」和「无EndHere到行尾」两种情况,这里有两个实用方案:
方案1:单正则表达式一步搞定
用一个正则让EndHere成为可选匹配项,同时匹配到行尾,命令如下:
sed -i -e 's/StartHere\(.*\)\(EndHere\)\?$/StartHere\2/' your_file.txt
细节解释:
StartHere:精准匹配行开头的固定字符串\(.*\):贪婪匹配StartHere之后的所有内容\(EndHere\)\?$:匹配行尾的EndHere,\?标记这个内容是可选的- 替换为
StartHere\2:保留StartHere,如果行里有EndHere就一并保留,否则只留下StartHere
用你的示例测试:
原行1:
StartHere Word1 EndHere→ 处理后:StartHereEndHere
原行2:StartHere Word2→ 处理后:StartHere
方案2:分两步替换(更直观)
如果觉得单正则有点绕,可以拆成两个有序的替换步骤,注意顺序不能乱:
sed -i -e 's/StartHere\(.*\)EndHere/StartHereEndHere/' -e '/EndHere/! s/StartHere.*/StartHere/' your_file.txt
细节解释:
- 第一个命令:专门处理包含
EndHere的行,直接删除StartHere和EndHere之间的所有内容 - 第二个命令:只对**不包含
EndHere**的行(/EndHere/!表示反向匹配),删除StartHere之后的所有内容
这种方式逻辑更清晰,也不会破坏已经处理过的带EndHere的行。
内容的提问来源于stack exchange,提问作者amine zawix
相关产品推荐
相关产品推荐

