Linux 随学随记 (1)

1. vim替换

ctrl+v 进入列模式,向下或向上移动光标,把需要注释的行的开头标记起来,然后按大写的I,再插入注释符,比如#,再按Esc,就会全部注释。或者也可以运行下面这些命令:

1
2
3
4
:s/^/#            " 用 # 注释当前行
:2,50s/^/# " 在 2~50 行首添加 # 注释
:.,+3s/^/# " 用 # 注释当前行和当前行后面的三行
:%s/^/# " 用 # 注释所有行

顺便说一下vim的替换,这个常用,已经牢记,其实和上面用命令注释多行是一样的,只不过是上面注释的命令里的"^"符号代表开始位置而已,在下面这些命令中,"s"代表替换,part1代表查找的内容,part2代表替换的内容,"%"代表所有行,"g"代表替换整行里所有的内容(如果不加"/g"则只替换每行第一个匹配part1的地方)。

p.n.关于g的用法貌似在本系统相反,虽然各处都这么说。。。

1
2
3
4
5
6
7
8
:s/part1/part2              " 用 part2 替换当前行中第 1 个 part1
:s/part1/part2/g " 用 part2 替换当前行中所有的 part1
:%s/part1/part2 " 用 part2 替换所有行中每行第 1 个 part1
:%s/part1/part2/g " 用 part2 替换所有行中所有的 part1
:2,50s/part1/part2 " 用 part2 替换第2行到第 50 行中每行第 1 个 part1
:2,50s/part1/part2/g " 用 part2 替换第2行到第 50 行中所有的 part1
:.,+3s/part1/part2 " 用 part2 替换当前行以及当前行后面的三行中每行第 1 个 part1
:.,+3s/part1/part2/g " 用 part2 替换当前行以及当前行后面的三行中所有的 part1

BTW:在替换时要注意,某些字符是需要转译的,如空格、括号等。

2. sed添加空行

2.1. 每行前后添加空行

1
2
3
4
5
6
sed G tmp                            # 每行后面添加一行空行
sed '{x;p;x;}' tmp # 每行前面添加一行空行
sed 'G;G' tmp # 每行后面添加两行空行
sed '{x;p;x;x;p;x;}' tmp # 每行前面添加两行空行
sed 'G;G;G' tmp # 每行后面添加三行空行
sed '{x;p;x;x;p;x;x;p;x}' tmp # 每行前面添加三行空行

依次类推,添加几行空行,就有几个G或者x;p;x

2.2. 如果行后有空行,则删除,然后每行后面添加空行

sed '/^$/d;G' tmp

2.3. 在匹配行前后添加空行

1
2
3
4
5
sed '/shui/G' tmp                # 如果一行里面有如果一行里面有 shui 这个单词,那么在他后面会添加一个空行
sed '/shui/{x;p;x;G}' tmp # 如果一行里面有 shui 这个单词,那么在他前后各添加一个空行
sed '/shui/{x;p;x;}' tmp # 如果一行里面有 shui 这个单词,那么在他前面添加一个空行
sed '1{x;p;x;}' tmp # 在第一行前面添加空行,想在第几行,命令中的 1 就改成几
sed '1G' tmp # 在第一行后面添加空行,想在第几行,命令中的 1 就改成几

2.4. 每几行后面添加一个空行

1
2
3
4
sed 'N;/^$/d;G' tmp                 # 每两行后面增加一个空行
sed 'N;/^$/d;{x;p;x;}' tmp # 每两行前面添加一个空行
sed 'N;N;/^$/d;G' tmp # 每三行后面增加一个空行
sed 'N;N;/^$/d;{x;p;x;}' tmp # 每三行前面增加一个空行

2.5. 以x为开头或以x为结尾的行前后添加空行

1
2
3
4
sed '/^xi/G;' tmp              # 以 xi 为开头的行后面添加空行
sed '/^xi/{x;p;x;}' tmp # 以 xi 为结尾的行前面添加空行
sed '/xi$/G;' tmp # 以 xi 为结尾的行后面添加空行
sed '/xi$/{x;p;x;}' tmp # 以 xi 为结尾的行后面添加空行

3. sed删除行首空格

如果确认只是空格:

sed 's/^ *//' infile

如果判断不清行首是空格还是制表符的话, 还可以用这个:

sed 's/^[[:space:]]*//' infile