从
White
Black
Green1
Red1
Yellow1
Blue
----
White
Black
Green2
Red2
Yellow2
Blue
----
White
Black
Green3
Red3
Yellow3
Blue
到
White
Black
Green1
Red1
Yellow1
Blue
----
White
Black
Green2
REDRED22
Yellow2
Blue
----
White
Black
Green3
Red3
Yellow3
Blue
答案1
sed 's/Red2/REDRED22/'
例子:
sed 's/Red2/REDRED22/' redred
White
Black
Green1
Red1
Yellow1
Blue
----
White
Black
Green2
REDRED22
Yellow2
Blue
----
White
Black
Green3
Red3
Yellow3
Blue
原始文件如下所示:
cat redred
White
Black
Green1
Red1
Yellow1
Blue
----
White
Black
Green2
Red2
Yellow2
Blue
----
White
Black
Green3
Red3
Yellow3
Blue
答案2
Perl 兼容的广义搜索应该是这样的:
(?<=Green2\n).*(?=(\n.*)+Yellow2)
据我所知,“之前”和“之后”模式是 Green2 和 Yellow2,并且应该选择 Green2 之后的整行。即使 Yellow2 之前有更多行,此模式也有效。然而,由于 sed 的转义要求,这很难在那里实现。
在 Perl 中你会这样做:
perl -0777 -pe 's/(?<=Green2\n).*(?=(\n.*)+Yellow2)/REDRED22/g' /path/to/file
答案3
我知道的很晚了,但我无法抗拒使用 sed 实现这项工作的挑战。
将文本放置在名为 redred 的文件中:
sed -E ':a;N;$!ba;s/(Green2\n)([a-zA-Z]*)([0-9]*)(\nYellow2)/\1\2\2\3\3\4/g' redred
用途这处理将 \n 读入 sed 的技术,以及用于分解和重建目标的位置标记。
这还将由文本和数字组成的任何目标(例如 Aubergine123)拆分为 [[:alpha:]] 和 [[:digit:]] 组件,然后按照 OP 似乎想要的方式重建目标字符串(AubergineAubergine123123)。