首页 > 解决方案 > sed - 在模式之间应用替换

问题描述

我有两种模式STARTEND并且想用这些模式之间的下划线替换每个空格。

例子

Lorem ipsum dolor START sit amet, consectetur END adipiscing elit.

应该转化为

Lorem ipsum dolor START_sit_amet,_consectetur_END adipiscing elit.

我知道用下划线替换每个空格的正则表达式

sed 's/ /_/g'

而且我也知道如何匹配两个模式之间的部分

sed 's/.*START\(.*\)END.*/\1/g'

但我不知道如何将这两件事结合起来。

标签: regexsedsubstitution

解决方案


作为替代方案,您可以使用 Perl:

perl -pe 's/(START.*?END)/$1=~s#\s#_#gr/ge'

(START.*?END)模式匹配一​​个子字符串STARTEND同时将其捕获到组 1 中,然后用组内容中的s#\s#_#gr每个空格 ( \s)替换_

或者,如果您使用的 Perl 不支持该r选项:

perl -pe 's/(?:START|\G(?!^))(?:(?!END).)*?\K\s/_/g'

请参阅在线演示第二个在线正则表达式演示

(?:START|\G(?!^))(?:(?!END).)*?\K\s比赛_

  • (?:START|\G(?!^))-START子字符串或上一个成功匹配的结尾(带\G(?!^)
  • (?:(?!END).)*?- 除换行符之外的任何字符,不开始END子字符串,尽可能少
  • \K- 匹配重置运算符丢弃先前匹配的文本
  • \s- 一个空格字符。

推荐阅读