接触 Shell/Vim 不久,这个问题一直没找到解决方案
比如说对某个文件,以 print 开头的所有行中的 aaa 替换成 bbb (是直接对原文件修改)
(其他不以 print 开头的行中也有 aaa ,不能替换掉)
用 Shift/Ctrl+V 进行区域替换我是会的,但是一直没搞清楚怎样筛选后替换
![]() | 1 lujiajing1126 2015-10-08 12:49:48 +08:00 shell 的话 sed+awk vim 的话可以正则搜索替换吧 |
![]() | 2 jprovim 2015-10-08 12:52:12 +08:00 ![]() |
3 doun 2015-10-08 13:09:13 +08:00 via Android 这个太牛 |
![]() | 4 halfcrazy 2015-10-08 13:36:11 +08:00 :%s/pattern_here/after_replacing/g 或者可以试试用 q 录制宏,这样就不用写正则了。不过这个用法的场景不一定合适 |
![]() | 5 zhantss 2015-10-08 15:15:35 +08:00 光用替换的话因为不确定有多少个 aaa 用个稍微有点笨的方法吧 :%s/^print\(.\+\)aaa/print\1bbb/g 跑个十来遍遍就好啦 反正你一行也不会有这么多 aaa 的吧 (苦笑) 泥垢了(□′)┻━┻ |
![]() | 6 zhantss 2015-10-08 15:16:11 +08:00 噢 那个\+换成* |
![]() | 7 yyai3 2015-10-08 15:25:20 +08:00 sed -i -e '/^print/ s/aaa/bbb/g' file |
![]() | 8 jiaslbang OP @lujiajing1126 sed+awk 我几乎没用过,能不能麻烦前辈指点一下怎样实现 [选定以 print 开头的所有行并将 aaa 替换成 bbb] 的效果? |
![]() | 10 jiaslbang OP @halfcrazy 可能是我表达不清,就是想先匹配 print 开头的所有行,用 g+s 的方法我已经解决了这个问题,参考我在上面的回复,不过也是非常感谢! |
![]() | 11 jiaslbang OP @zhantss 哈哈,你的方法好萌,我觉得是可以 work 的,不过从效率上是有优化空间的……推荐你用 g+s 的方法,参见我楼上的回复,多谢啦:D |
![]() | 13 zhantss 2015-10-08 15:45:37 +08:00 |
14 lonelinsky 2015-10-08 16:01:02 +08:00 |
![]() | 15 zhantss 2015-10-08 16:05:58 +08:00 |
![]() | 17 jiaslbang OP @lonelinsky 宏是个好方法,我还需要点时间适应,多谢啦! |