如何对两个模式之间出现的行之一以及多个文件进行字符串替换(变量值)

如何对两个模式之间出现的行之一以及多个文件进行字符串替换(变量值)

文件1.txt

ABC123DEF
START
A
B
C=??
D
END
UVZ789XYZ
START
A
B
C=??
D
END

预期输出是

ABC123DEF
START
A
B
C=123
D
END
UVZ789XYZ
START
A
B
C=789
D
END

如何使用“sed”/“awk”/“tcl”/“vim”做到这一点?

答案1

G
/^(.).*\n\1/    { P; d }
s/^(.)(.*)\n.*/\1\n\1\2/
p
s/^(.)\n.*/\1/
h

是一个可以作为灵感的 sed 程序。它这样做:

]# cat infile 
alpha
and
alas
arc
fat
foo
zoo
boat
bee
bed

]# ./letter-group.sed infile 
a
alpha
and
alas
arc
f
fat
foo
z
zoo
b
boat
bee
bed

它需要一些改变,但我认为基本思想可以重用。info sed了解详情。


#!/bin/sed -Enf

# Insert a title line (group header) when first letter changes
#
#
# If first letter stays the same, just print input line and exit
#
G
/^(.).*\n\1/    { P; d }


# new letter: move it to first line, and print
#
s/^(.)(.*)\n.*/\1\n\1\2/
p

# hold the new letter
s/^(.)\n.*/\1/
h

在这里您可以看到所有这些元素:s///\1和hold/get。如果您提出一些有趣的规范,我可能会尝试适应,但这个示例有点干燥。

相关内容