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 精萃
版权声明:本文标题:sed 精萃 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1732356121h1534479.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论