[求助] Shell/Vim 中如何实现对符合特定条件的行进行替换操作?

2015-10-08 12:31:09 +08:00
 jiaslbang

接触 Shell/Vim 不久,这个问题一直没找到解决方案

比如说对某个文件,以 print 开头的所有行中的 aaa 替换成 bbb (是直接对原文件修改)
(其他不以 print 开头的行中也有 aaa ,不能替换掉)

简单来说就是:筛选+替换

用 Shift/Ctrl+V 进行区域替换我是会的,但是一直没搞清楚怎样筛选后替换

3268 次点击
所在节点    Vim
17 条回复
lujiajing1126
2015-10-08 12:49:48 +08:00
shell 的话 sed+awk

vim 的话可以正则搜索替换吧
jprovim
2015-10-08 12:52:12 +08:00
doun
2015-10-08 13:09:13 +08:00
这个太牛
halfcrazy
2015-10-08 13:36:11 +08:00
:%s/pattern_here/after_replacing/g

或者可以试试用 q 录制宏,这样就不用写正则了。不过这个用法的场景不一定合适
zhantss
2015-10-08 15:15:35 +08:00
光用替换的话因为不确定有多少个 aaa 用个稍微有点笨的方法吧

:%s/^print\(.\+\)aaa/print\1bbb/g

跑个十来遍遍就好啦 反正你一行也不会有这么多 aaa 的吧 (苦笑)
泥垢了(╯‵□′)╯︵┻━┻
zhantss
2015-10-08 15:16:11 +08:00
噢 那个\+换成*
yyai3
2015-10-08 15:25:20 +08:00
sed -i -e '/^print/ s/aaa/bbb/g' file
jiaslbang
2015-10-08 15:26:38 +08:00
@lujiajing1126 sed+awk 我几乎没用过,能不能麻烦前辈指点一下怎样实现 [选定以 print 开头的所有行并将 aaa 替换成 bbb] 的效果?
jiaslbang
2015-10-08 15:29:08 +08:00
@jprovim 原来 g 是可以和 s 连用的,多谢前辈!

:g/^print/s/aaa/bbb/g

测试有效!
jiaslbang
2015-10-08 15:31:38 +08:00
@halfcrazy 可能是我表达不清,就是想先匹配 print 开头的所有行,用 g+s 的方法我已经解决了这个问题,参考我在上面的回复,不过也是非常感谢!
jiaslbang
2015-10-08 15:35:22 +08:00
@zhantss 哈哈,你的方法好萌,我觉得是可以 work 的,不过从效率上是有优化空间的……推荐你用 g+s 的方法,参见我楼上的回复,多谢啦:D
jiaslbang
2015-10-08 15:36:05 +08:00
@yyai3 哈,原来这样也可以,多谢大神!
zhantss
2015-10-08 15:45:37 +08:00
@jiaslbang
Power of G 那个我的确看到了
但是我总不能回句支持就撤了吧
不行 这不符合我的风格 我一定要说点什么
于是.....
lonelinsky
2015-10-08 16:01:02 +08:00
@zhantss
@jiaslbang
其实用宏也满赞的

gg
qa
/^print<cr>
:s/aaa/bbb/g<cr>
q
gg
9999@a

=.=
zhantss
2015-10-08 16:05:58 +08:00
@lonelinsky
(╯‵□′)╯︵┻━┻
别拦着我 我要调外部脚本了
jiaslbang
2015-10-08 18:06:22 +08:00
@zhantss 哈哈大爱你的风格,一定是妹子+高级萌
jiaslbang
2015-10-08 18:07:27 +08:00
@lonelinsky 宏是个好方法,我还需要点时间适应,多谢啦!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/226278

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX