0

如何使用 sed 对匹配模式的出现次数进行编号。例如:我有一个包含以下格式数据的文件:

line1
line2
line3
********
line4
line5
********
line6
line7
line8
line9
*******
line10

我需要以下格式的输出:

line1
line2
line3
1*******
line4
line5
2*******
line6
line7
line8
line9
3******
line10

因此,基本要求是将/^\*/的第一次出现替换为1,将第二次出现替换为 2,第三次替换为 3,依此类推。

4

5 回答 5

2

sed不能做任何算术。使用不同的工具,例如 Perl:

perl -pe 'print ++$i if /^\*+$/' file
于 2013-08-23T11:29:42.113 回答
2

为正确的工作使用正确的工具。这是为 awk 量身定做的工作:

awk '$1 ~ /\*\*\*\*/{print ++a $0; next} {print}' file
line1
line2
line3
1********
line4
line5
2********
line6
line7
line8
line9
3*******
line10

或者纯 BASH 解决方案:

while read l; do
    [[ $l == *'****'* ]] && l=$((++x))"$l"
    echo "$l"
done < file
于 2013-08-23T11:26:14.747 回答
2

这可能对您有用(GNU sed):

sed -r '/^\*/!b;x;:a;s/9(_*)$/_\1/;ta;s/^(_*)$/0\1/;s/$/:9876543210/;s/(.)(_*):.*(.)\1.*/\3\2/;s/_/0/g;x;G;s/(.*)\n(.*)/\2\1/' file

然而,作为一种解决方案,它只不过是个玩笑where there's a will there's a way

于 2013-08-23T21:08:56.780 回答
1

试试这个单线(awk):

 awk '/^[*]+$/{$0=++i$0}7' file
于 2013-08-23T11:30:05.553 回答
0

改用 awk:

 awk '{if ($0 ~ /[*]+/) printf "%d%s\n", ++a, substr($0, 2); else print $0;}' file
于 2013-08-23T11:39:06.820 回答