博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
sed 精萃
阅读量:4049 次
发布时间:2019-05-25

本文共 3372 字,大约阅读时间需要 11 分钟。

– 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# 查找 

的所有行sed -n '/

/,/<\/p>/p' test.txt# 查找

的所有行,并保存到 test_part.txtsed '/

/,/<\/p>/w test_part.txt' test.txt# 查找

在哪行,= 表示打印行号sed -n '/

/{=;p}' test.txt# 查找到 100 后停止,q 表示停止,相当于 head -100 test.txtsed '100q' test.txt

查找行语法

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

/,/<\/p>/ 表示

的包围的所有行

替换例子

# 把 a 替换成 b。 只替换一行中找到的第 1 个 ased 's/a/b/' test.txt# 同上, 只替换一行中找到的第 2 个 ased 's/a/b/2' test.txt# 同上,替换一行中找到的所有 ased 's/a/b/g' test.txt# 查找包含 aye 的行,找到后把 a 替换成 bsed '/aye/s/a/b/g' test.txt# 把第 6 行的 a 替换成 bsed '6s/a/b/g' test.txt# 把第 6 到 8 行的 a 替换成 bsed '6,8s/a/b/g' test.txt# 除了6到8行,把其他行的 a 替换成 bsed '6,8!s/a/b/g' test.txt# 查找 

的所有行,找到后把 a 替换成 bsed '/

/,/<\/p>/s/a/b/g' test.txt# 查找

的所有行,# 在找到的行中 1.继续查找包含 aye 的行,找到后把 a 替换成 b,# 在找到的行中 2. 删除空行sed '/

/,/<\/p>/{/aye/s/a/b/g;/^$/d}' test.txt# 查找包含

行,找到后把删除换行符,N 表示读入一行sed '/

/{N;s/\n//g}' test.txt# 把

\n<\p> 替换成

<\p>sed '/

$/{N;/<\/p>/s/\n//g;P;D}' test.txt

替换语法

sed [address]s/pattern/replacement/flags test.txt1. address 是可选的, 它表示一个行地址,可以是行号或正则表达式, 表示要操作的行, 默认对所有行进行操作.    1.1 address 可以有两个,表示一个范围, 用逗号分隔。 如 /

/,/<\/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# 删除 

的所有行sed '/

/,/<\/p>/d' test.txt# 保留

的行,删除其他所有行sed '/

/,/<\/p>/!d' test.txt# 查找包含

的行,如果下一行是空行,则删除空行sed '/

/{n;/^$/d}' test.txt# 把连续多个空行替换成一个sed '/^$/{N;/^\n$/d}' test.txt

删除行语法

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

/,/<\/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.txt1. address 表示一个行地址,可以是行号或正则表达式, 表示要操作的行。address 可以有两个,表示一个范围, 用逗号分隔。 如 /

/,/<\/p>/ 表示

的包围的所有行2. flag 可以是 i a c r 2.1 i 表示在当前行之前插入一行,内容为 text 2.2 a 表示在当前行之后插入一行,内容为 text 2.3 r 表示在当前行之后插入指定文件中的内容为 2.4 c 表示修改当前行为 text

转换例子

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

转换语法

[address]y/abc/xyz/1. address 表示一个行地址,可以是行号或正则表达式, 表示要操作的行。address 可以有两个,表示一个范围, 用逗号分隔。 如 /

/,/<\/p>/ 表示

的包围的所有行2. 按位转换, a 转 x, b 转 y, c 转 z

注意事项

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

sed '1d' origFile > newFilemv 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

– 更多参见:

– 声 明:转载请注明出处
– Last Updated on 2015-10-28
– Written by ShangBo on 2015-10-26
– End

你可能感兴趣的文章
openstack网络总结
查看>>
excel 查找一个表的数据在另一个表中是否存在
查看>>
centos 7 上配置dnsmasq 同时支持ipv4和ipv6的DHCP服务
查看>>
AsyncTask、View.post(Runnable)、ViewTreeObserver三种方式总结frame animation自动启动
查看>>
Android中AsyncTask的简单用法
查看>>
java反编译命令
查看>>
activemq依赖包获取
查看>>
概念区别
查看>>
final 的作用
查看>>
在Idea中使用Eclipse编译器
查看>>
Idea下安装Lombok插件
查看>>
zookeeper
查看>>
Idea导入的工程看不到src等代码
查看>>
技术栈
查看>>
Jenkins中shell-script执行报错sh: line 2: npm: command not found
查看>>
8.X版本的node打包时,gulp命令报错 require.extensions.hasownproperty
查看>>
Jenkins 启动命令
查看>>
Maven项目版本继承 – 我必须指定父版本?
查看>>
通过C++反射实现C++与任意脚本(lua、js等)的交互(二)
查看>>
利用清华镜像站解决pip超时问题
查看>>