从

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)。

相关内容