sed匹配第N个进行替换
2017-08-22 16:28
106 查看
文章来源:良玉的博客 http://www.uouo123.com/
文本:
aa
88
bb
88
88
cc
88
88
1、替换第一个88为--:
sed '0,/88/s//--/' file
sed ':a;N;$!ba;s/88/--/' file
[解析]
这有两种方法,第一个是只匹配到第一个88为止,然后替换那个88为--。
第二个句子是通过循环把文本全部读进pattern space 然后只替换第一个。
2、替换第N[3]个88为--:
#替换第三个
sed '/88/{x;s/^/./;/^\.\{3\}$/{x;s/.*/--/;x};x;}' file
sed ':a;N;$!ba;s/88/--/3' file
[解析]
第一个命令叫打点记数法,因为sed没有 var++ 之类的操作来记数。
第二个命令和上面第一个其实是一样的原理,全部读入文本后统一替换第3个匹配的内容。
3、替换最后一个匹配的88为--:
sed ':a;/\n88/!{$s/88/--/;N;ba};P;D' file
sed ':a;N;$!ba;s/\(.*\)88/\1--/' file
[解析]
第一个命令,没匹配到 /\n88/ 的内容就读取下一行,然后 ba 跳转去开始处,如果读取到88的行呢,就执行后面的 P;D 组合,D也有循环功能,一直把匹配 \n88 内容的第一行打印,删除,直到不匹配/\n88/(因为换行符已经被打印出去了,所以不再会匹配到 \n88),这时候才继续往下读,如果又读到88的行,那么又执行P;D循环,同上操作。一直到匹配到最后一个88的行,继续读取到末行时执行替换,N 因为没有下一行可读,所以会自动中止命令,因为没有 -n 参数会打印 pattern space 里的内容到屏幕,所以就不会再执行后面的 ba 避免了死循环,这样的用法只存在于 GNU sed ,大家注意。所以这整个流程只会替换最后一个88。
第二个命令其实和上面的都一样,也是全部读进 pattern space 里,最后利用正则的贪婪替换掉最后一个88。
文本:
aa
88
bb
88
88
cc
88
88
1、替换第一个88为--:
sed '0,/88/s//--/' file
sed ':a;N;$!ba;s/88/--/' file
[解析]
这有两种方法,第一个是只匹配到第一个88为止,然后替换那个88为--。
第二个句子是通过循环把文本全部读进pattern space 然后只替换第一个。
2、替换第N[3]个88为--:
#替换第三个
sed '/88/{x;s/^/./;/^\.\{3\}$/{x;s/.*/--/;x};x;}' file
sed ':a;N;$!ba;s/88/--/3' file
[解析]
第一个命令叫打点记数法,因为sed没有 var++ 之类的操作来记数。
第二个命令和上面第一个其实是一样的原理,全部读入文本后统一替换第3个匹配的内容。
3、替换最后一个匹配的88为--:
sed ':a;/\n88/!{$s/88/--/;N;ba};P;D' file
sed ':a;N;$!ba;s/\(.*\)88/\1--/' file
[解析]
第一个命令,没匹配到 /\n88/ 的内容就读取下一行,然后 ba 跳转去开始处,如果读取到88的行呢,就执行后面的 P;D 组合,D也有循环功能,一直把匹配 \n88 内容的第一行打印,删除,直到不匹配/\n88/(因为换行符已经被打印出去了,所以不再会匹配到 \n88),这时候才继续往下读,如果又读到88的行,那么又执行P;D循环,同上操作。一直到匹配到最后一个88的行,继续读取到末行时执行替换,N 因为没有下一行可读,所以会自动中止命令,因为没有 -n 参数会打印 pattern space 里的内容到屏幕,所以就不会再执行后面的 ba 避免了死循环,这样的用法只存在于 GNU sed ,大家注意。所以这整个流程只会替换最后一个88。
第二个命令其实和上面的都一样,也是全部读进 pattern space 里,最后利用正则的贪婪替换掉最后一个88。
相关文章推荐
- SED找到某一行,然后在这一行中进行替换的命令写法
- idea 使用正则表达式 进行匹配替换
- os x下使用sed进行字符串替换
- 对整段内容进行匹配和替换
- 如何进行正则匹配替换
- 用sed命令如何能把一个匹配模式替换为换行符
- 用sed或vi进行多文件替换的方法
- [perl] 一句命令进行跨行匹配替换
- sed 替换文件中匹配行头的一行
- SED,AWK学习笔记Part 1-----利用正则表达式进行文本匹配
- 用sed命令进行正则表达式匹配字符串,如何检验匹配是否成功?
- SED,AWK学习笔记Part 1-----利用正则表达式进行文本匹配[转]
- 正则表达式中的匹配,替换,切割,获取,这四个使用时具体用哪一个,进行案例分析
- sed命令:删除匹配行和替换
- 对字符串进行 匹配,查找,替换,判断。
- sed 命令针对某一行进行替换操作
- Delphi中使用RegExpr单元进行匹配与替换操作
- Sed 删除匹配行,匹配的字符用Shell变量替换,且变量里含有斜杠“/”时,无法删除 解决办法
- 使用sed创建目录和简单匹配替换
- 使用sed进行文字替换