admin 管理员组

文章数量: 887006

sed 精萃

– Start
在 Linux 中,如果你要编辑文件,你可以使用 vi,ed 等交互式编辑器。如果你要在脚本中编辑文件,你可以使用 sed,sed是一个非交互式的编辑器。sed也是一个流编辑器,因为sed不改变原文件,原文件作为输入流,编辑后输出到其它地方。sed也是一个行编辑器,因为sed逐行编辑文件,编辑完一行,然后编辑下一行,所以无论文件多大,sed也不会太耗内存。

查找行例子

# 查找包含 aye 的行
sed -n '/aye/p' test.txt# 查找第 6 行
sed -n '6p' test.txt# 查找 6 到 8 行
sed -n '6,8p' test.txt# 查找 <p> 到 </p> 的所有行
sed -n '/<p>/,/<\/p>/p' test.txt# 查找 <p> 到 </p> 的所有行,并保存到 test_part.txt
sed '/<p>/,/<\/p>/w test_part.txt' test.txt# 查找 <p> 在哪行,= 表示打印行号
sed -n '/<p>/{=;p}' test.txt# 查找到 100 后停止,q 表示停止,相当于 head -100 test.txt
sed '100q' test.txt

查找行语法

sed -n '[address]p' test.txt
1. sed 默认打印出所有行,-n 表示由用户决定打印什么内容,p 表示打印 address 匹配的行
2. address 表示一个行地址,可以是行号或正则表达式, 表示要操作的行。
3. address 可以有两个,表示一个范围, 用逗号分隔。 如 /<p>/,/<\/p>/ 表示 <p> 到 </p> 的包围的所有行

替换例子

# 把 a 替换成 b。 只替换一行中找到的第 1 个 a
sed 's/a/b/' test.txt# 同上, 只替换一行中找到的第 2 个 a
sed 's/a/b/2' test.txt# 同上,替换一行中找到的所有 a
sed 's/a/b/g' test.txt# 查找包含 aye 的行,找到后把 a 替换成 b
sed '/aye/s/a/b/g' test.txt# 把第 6 行的 a 替换成 b
sed '6s/a/b/g' test.txt# 把第 6 到 8 行的 a 替换成 b
sed '6,8s/a/b/g' test.txt# 除了6到8行,把其他行的 a 替换成 b
sed '6,8!s/a/b/g' test.txt# 查找 <p> 到 </p> 的所有行,找到后把 a 替换成 b
sed '/<p>/,/<\/p>/s/a/b/g' test.txt# 查找 <p> 到 </p> 的所有行,
# 在找到的行中 1.继续查找包含 aye 的行,找到后把 a 替换成 b,
# 在找到的行中 2. 删除空行
sed '/<p>/,/<\/p>/{/aye/s/a/b/g;/^$/d}' test.txt# 查找包含 <p> 行,找到后把删除换行符,N 表示读入一行
sed '/<p>/{N;s/\n//g}' test.txt# 把<p>\n<\p> 替换成 <p><\p>
sed '/<p>$/{N;/<\/p>/s/\n//g;P;D}' test.txt

替换语法

sed [address]s/pattern/replacement/flags test.txt1. address 是可选的, 它表示一个行地址,可以是行号或正则表达式, 表示要操作的行, 默认对所有行进行操作.
    1.1 address 可以有两个,表示一个范围, 用逗号分隔。 如 /<p>/,/<\/p>/ 表示 <p> 到 </p> 的包围的所有行
2. pattern 是一个正则表达式.
3. replacement 是要替换的内容, 它不支持正则表达式,只支持下面的原字符。
    3.1 & 引用 pattern 匹配的内容
    3.2 \1 .. \9 引用 pattern 中括号匹配的内容
4. flags 是可选的
    4.1 默认只替换一行中找到的第一个 pattern
    4.2 n(1..52) 指定要替换一行中找到的第 n 个 pattern
    4.3 g 替换一行中找到的所有 pattern
    4.4 p 打印修改后的内容
    4.5 w file 将修改后的行输出到文件
5. 分隔符可以是任何成对字符,如: s!pattern!replacement!flags

删除行例子

# 删除所有行
sed 'd' test.txt# 删除第一行
sed '1d' test.txt# 删除最后一行
sed '$d' test.txt# 删除空行
sed '/^$/d' test.txt# 删除 70 到 80 行
sed '70,80d' test.txt# 删除 <p> 到 </p> 的所有行
sed '/<p>/,/<\/p>/d' test.txt# 保留 <p> 到 </p> 的行,删除其他所有行
sed '/<p>/,/<\/p>/!d' test.txt# 查找包含 <p> 的行,如果下一行是空行,则删除空行
sed '/<p>/{n;/^$/d}' test.txt# 把连续多个空行替换成一个
sed '/^$/{N;/^\n$/d}' test.txt

删除行语法

sed '[address]d' test.txt
1. address 表示一个行地址,可以是行号或正则表达式, 表示要操作的行。
2. address 可以有两个,表示一个范围, 用逗号分隔。 如 /<p>/,/<\/p>/ 表示 <p> 到 </p> 的包围的所有行

插入,修改行例子

# 在第1行之前插入一行
sed '1i text' test.txt# 在第1行之后插入一行
sed '1a text' test.txt# 在第1行之后插入 test2.txt 文件的内容
sed '1r test2.txt' test.txt# 修改第1行的内容
sed '1c text' test.txt

插入,修改行语法

sed '[address]flag[text]' test.txt
1. address 表示一个行地址,可以是行号或正则表达式, 表示要操作的行。address 可以有两个,表示一个范围, 用逗号分隔。 如 /<p>/,/<\/p>/ 表示 <p> 到 </p> 的包围的所有行
2. flag 可以是 i a c r2.1 i 表示在当前行之前插入一行,内容为 text2.2 a 表示在当前行之后插入一行,内容为 text2.3 r 表示在当前行之后插入指定文件中的内容为2.4 c 表示修改当前行为 text

转换例子

# 小写转成大写
sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' test.txt

转换语法

[address]y/abc/xyz/
1. address 表示一个行地址,可以是行号或正则表达式, 表示要操作的行。address 可以有两个,表示一个范围, 用逗号分隔。 如 /<p>/,/<\/p>/ 表示 <p> 到 </p> 的包围的所有行
2. 按位转换, a 转 x, b 转 y, c 转 z

注意事项

由于 sed 不改变原文件,如果你想更改原文件,你需要通过下面的方式。

sed '1d' origFile > newFile
mv newFile origFile

千万不要通过下面的方式,否则你的原文件会被清空。

sed '1d' origFile > origFile

如果你需要多次替换,不需要使用管道。

sed -r 's/^\s+//g' test.txt | sed -r 's/\s+$//g'

可以把多个表达式用分号分隔。

sed -r 's/^\s+//g;s/\s+$//g' test.txt

或使用 -e 选项指定多个表达式。

sed -r -e 's/^\s+//g' -e 's/\s+$//g' test.txt

– 更多参见:Linux 精萃
– 声 明:转载请注明出处
– Last Updated on 2015-10-28
– Written by ShangBo on 2015-10-26
– End

本文标签: sed 精萃