ly5066113@ubuntu:~$ sed '/a/{x;s/^/./;/^.\{3\}$/{x;s/a/b/;b};x}' urfile
a
a
b
a
a
a
ly5066113@ubuntu:~$ sed '/a/{x;s/^/./;/^.\{4\}$/{x;s/a/b/;b};x}' urfile
a
a
a
b
a
a
ly5066113@ubuntu:~$ sed '/a/{x;s/^/./;/^.\{5\}$/{x;s/a/b/;b};x}' urfile
a
a
a
a
b
a
复制代码
我们可以看到,对于次数的增加,我们只需要调整需要匹配的数值即可。
/a/{ #匹配时,开始记数
x #交换pattern space与hold space
s/^/./ #向hold space打一个 .
/^.\{3\}$/{ #判断 . 的个数是否达到要求
x #如果达到要求,交换hold space与pattern space
s/a/b/ #进行替换
b #跳转到代码结束
} #
x #交换hold space与pattern space
} #
x #交换pattern space与hold space,保存读入的内容
1s/^/1/ #如果是第一行,初始化行号1
G #将保存的内容追加回pattern space
s/\n/ /p #将换行替换为空格,并打印
s/ .*// #去处空格以后的所有内容,pattern space只剩下行号
/^9*$/s/^/0/ #如果行号都为9,在前面补0
s/.9*$/x&/ #用x分隔不需要改变和需要改变的数字
h #将pattern space中的内容保存到hold space
s/.*x// #删除不需要改变的数字
y/0123456789/1234567890/ #对数字进行 +1 的操作
x #交换pattern space与hold space
s/x.*// #删除需要改变的数字
G #将改变后的数字追加回pattern space
s/\n// #删除换行,得到新的行号
h #保存新行号到hold space
整体的思路:
每读入一行记录,将保存在hold space中的行号(如果是第一行,需要初始化),和本行记录合并输出
然后将行号 +1 ,保存至hold space
x #交换pattern space与hold space,保存读入的内容
1s/^/1/ #如果是第一行,初始化行号1
G #将保存的内容追加回pattern space
s/\n/ /p #将换行替换为空格,并打印
s/ .*// #去处空格以后的所有内容,pattern space只剩下行号
/^9*$/s/^/0/ #如果行号都为9,在前面补0
s/.9*$/x&/ #用x分隔不需要改变和需要改变的数字
h #将pattern space中的内容保存到hold space
s/.*x// #删除不需要改变的数字
y/0123456789/1234567890/ #对数字进行 +1 的操作
x #交换pattern space与hold space
s/x.*// #删除需要改变的数字
G #将改变后的数字追加回pattern space
s/\n// #删除换行,得到新的行号
h #保存新行号到hold space
整体的思路:
每读入一行记录,将保存在hold space中的行号(如果是第一行,需要初始化),和本行记录合并输出
然后将行号 +1 ,保存至hold space