文本三剑客之sed
Sed: 文本流编辑器; 非交互式,能同时处理多个文件多个行的内容,
不对源文件改动,把整个文件输出到屏幕;还可以对源文件改动,但是不会在输出到屏幕上返回结果
语法格式:
[root@test tmp]# sed —help
Usage: sed [OPTION]… {script-only-if-no-other-script} [input-file]…
sed的命令格式: sed [options] ‘sed command’ filename
sed的脚本格式: sed [options] -f ‘sed script’ filename
常用选项:
-n : 只打印模式匹配的行
-e :直接在命令行模式上进行sed动作编辑(默认选项)
-f : 将sed的动作写在一个文件中,用-f “sed script” 执行 script文件中的sed动作
-r :支持扩展正则表达式
-i :直接去修改文本内容
查询文本的方式:
使用行号和行号范围
x: 行号
x,y : 从x,y行
x,y! : 从x,y行之外
/pattern : 查询包含模式的行
/pattern/,/pattern/ : 查询包含两个模式的行
/pattern/,y : y行内查询包含匹配模式的行
x,/pattern/: x行后查询包含匹配模式的行
编辑命令:
p : 打印匹配的行
= : 显示文件行号
a\: 指定行号后添加新文本
i\: 指定行号前添加新文本
d: 删除定位行
c\: 用新文本内容替换定位到的行
w filename: 写文本到另一个文件中
r filename: 读另一文本到本文件中
s /// : 替换
替换标记:
g: 行内全局替换
p:显示替换成功的行
w:将替换成功后的内容保存到指定文件中
分隔符: /// —> @@@作为分隔符也是可以的
q: 第一个模式匹配后立即退出
{}: 在定位执行行的命令组,用;进行分隔
g: 将模式2粘贴到/pattern n/ 位置
实例:
1. 只打印文本的第1到4行内容
[root@test tmp]# sed -n ‘1,4p’ fstab
2. 只打印文本中包含xfs的行
[root@test tmp]# sed -n ‘/xfs/p’ fstab
3. 只打印文本中以UUID开头的行
[root@test tmp]# sed -n ‘/^UUID=./p’ fstab
4. 显示文件中以UUID开头行的行号
[root@test tmp]# sed -n ‘/^UUID=./=’ fstab
5. 在/etc/hosts文件中第3行位置添加主机名解析内容
[root@test tmp]# sed -i ‘2a\192.168.10.10 node1’ /etc/hosts 指定行号后添加新文本
6. 删除上述添加的解析内容
[root@test tmp]# sed -i ‘3d’ /etc/hosts 删除定位行 上一次匹配的
7. 替换以UUID开头行的内容
[root@test tmp]# sed -i ‘/^UUID=./c\test……’ fstab
8. 将fstab文件中以#开头的所有内容保存至fstab_part文件中
[root@test tmp]# sed ‘/^#./w fstab_part’ fstab
9. 将fstab_part文件内容读写到1.txt文件中第2行以后位置
[root@test tmp]# sed -i ‘2r fstab_part’ 1.txt
10.将1.txt文本中hello替换成全局替换成大写
[root@test tmp]# sed -i ‘s/hello/HELLO/g’ 1.txt
将替换的内容保存至1_part.txt文本中
[root@test tmp]# sed ‘s/HELLO/Hi/g w 1_part.txt’ 1.txt
注意事项: 在进行编辑操作的时候,尽量先默认在命令行输出;保证正确的情况下,再使用-i参数对其
文本进行修改
111111 —> #111111
reg:
sed “1,3s/(.)/#\1/“ \1第一行:指定行号前添加新的文本 s替换
1. 显示/etc/passwd文件中位于第偶数行的用户的用户名
sed -n ‘n;p’ /etc/passwd | cut -d: -f1 #查看列数一的数据
2. 为/tmp/1.txt 文件中前三行的行首加#号。
sed -i ‘1,3s@(^.)@#\1@g’ /tmp/grub.conf ????、
增加:
[root@test tmp]# sed -i -r “1,3s/(.)/#\1/“ 1.txt
[root@test tmp]# cat 1.txt
#hello eagles
#hello linux
#/etc/fstab
去掉#可以:
[root@test tmp]# sed -i -r “1,3s/^#(.)/\1/“ 1.txt
[root@test tmp]# cat 1.txt
hello eagles
hello linux
/etc/fstab
1,3s@(^.)@#\1@g
取消注释行:
sed ‘1,10s@^#(.)$@\1@g’ 1.txt
^#+(.)$ —-> 查询内容:所有#开头的行
\1 替换的内容 (.)