Tag: linux

在多个文件中执行替换操作

有些需要在多个文件中执行替换操作:

1
2
3
4
5
# 在执行替换之前,先确认
grep "abcd" *.log
# 执行替换
sed -i "s/abcd/1234/g" *.log

vim中替换^M符号

在使用git pull时,发生文件冲突,合并冲突时,发现行尾显示了很多 ^M 的符号。这是一个特殊符号,可以使用替换:

1
:%s/^M$//g

注意:命令中的 ^M 需要用“ CTRL-V CTRL-M ” 生成。

vim命令汇总

vim 命令汇总

http://www.cnblogs.com/softwaretesting/archive/2011/07/12/2104435.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 单词操作
yw 复制单词
dw 删除单词
n== n行缩进
. 重复刚才的命令
z+f % 折叠代码
o 插入一个空行
CTRL+v, I, #, ESC 多行注释(#可以换成其他的,例如//)
删除多行注释的方法,同样 Ctrl+v 进入列选择模式,移到光标把注释符选中,按下d,注释就被删除了
输入当前文件名:
1. 进入插入模式
2. <C-R>
3. %

sed命令

问题

源数据:

1
2
3
4
5
6
7
drt=2013-09-02+22:14:28&at=7&cid=mDamz1b7WRJZ
drt=2013-09-02+22:14:29&at=3&cid=Q4ETETM9Hjx0
drt=2013-09-02+22:14:39&at=0&cid=ytBSubxEaFN6
drt=2013-09-02+22:14:40&at=3&cid=mDamz1b7WRJZ
drt=2013-09-02+22:14:42&at=6&cid=ytBSubxEaFN6
drt=2013-09-02+22:14:42&at=3&cid=mDamz1b7WRJZ
drt=2013-09-02+22:14:45&at=0&cid=66OwWFuVBMSS

希望把drt字段中的+号及后面的替换掉:

1
sed 's/\+[\d:]+&/&/g'

结果就是死活不工作。。。

解决

原来&在sed中也是元字符,之前从来没注意到这个,和普通正则还差异多多。最后就只是一个转义符的事情:

1
sed 's/\+/\&/g'

关于&的说明:

1
保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。

还有:

  • sed的元字符里原来没有+号的。。。
  • \d发现也是无效的

最终就变成了:

1
sed 's/+[0-9:]*\&/\&/g'

附录

rsync命令

从远程服务器复制文件到本地服务器以前通常会使用scp命令,例如:

1
scp -P 3000 user@host:/data2/bak/20130801/part-* /home/windows/data/20130825/

不过用脚本跑的时候,发现得到的文件不齐全,有些文件不知道为什么没有下载到本地,所以寻找可以不覆盖更新的命令。本以为scp有这样的参数的,不过没发现。后来就使用rsync命令了,如:

1
rsync -aPuv '-e ssh -p 3000' user@host:/data2/bak/20130825/part-* /home/windows/data/20130825/

rsync的参数解释:

  • P:显示进度条信息
  • u:update,只返回不同的文件

扩展:http://www.howtocn.org/rsync:use_rsync