欢迎各位兄弟 发布技术文章
这里的技术是共享的
常用选项:
-n:不输出模式中的内容至屏幕:
-e:多点编辑:
-f /PATH/TO/SCRIPT_FILE:从指定文件中读取编辑脚本:
-r:支持使用扩展正则表达式;
-i:原处编辑;
使用 -i 一定要先测试好 ,然后备份,这一点一定要注意
sed 里面可以实现条件判断和循环的
地址定界
1)不给地址,对全文进行处理
2)单地址
#:指定的行
/pattern/:被此处模式所能够匹配的每一行
3)地址范围
#,#
#,+#
/pat1/,/pat2/
#,/pat1/
4)~:步进
1~2 读所有奇数行
2~2 读所有偶数行
-n, --quiet, --silent,,,suppress automatic printing of pattern space 静默模式,抑制模式空间里面的自动打印
等于号=,为模式空间中的行打印行号 显示符合条件的行的行号
[root@localhost ~]# sed '1,3=' /etc/fstab # 详解 见 /node-admin/22282
感叹号!是为地址定界取反的,跟在地址后面) (本质上感叹号不是一个命令) 除了 UUID开头的都删除 # d 表示删除
# sed '/^UUID/!d' /etc/fstab
编辑命令:
d: 删除
p: 显示模式空间中的内容
a \text:在行后面追加文本;支持使用\n实现多行追加:
i \text:在行前面插入文本:支持使用\n实现多行插入:
c \text:替换行为单行或多行文本:
w /path/to/somefile:保存模式空间匹配到的行至指定文件中:
r/path/from/somefile:读取指定文件的文本流至模式空间中匹配到的行的行后:
=: 为模式空间中的行打印行号:
!:取反条件;
s///:支持使用其它分隔符,s@@@,s###;
替换标记:
g: (global)行内全局替换
p: (print)如果替换成功,则显示之,,,,显示替换成功的行
w /PATH/TO/SOMEFILE: (write)将替换成功后的结果保存至指定的文件中
高级编辑命令
模式空间 pattern space 相当于生产车间
保持空间 (保留空间) hold space 相当于仓库 默认情况下,为空白行(当模式空间删除掉的时候保持空间也是为空,就没有空白行了;换句话说,没有模式空间(不是清空模式空间,是模式空间根本没有)的情况下,保持空间也没有了又好像不能这么理解,;;;;;;;; 好像是说模式空间删除掉后,就无法执行G追加了)
高级编辑命令:
h:把模式空间中的内容覆盖至保持空间中:
H:把模式空间中的内容追加至保持空间中:
g:从保持空间取出数据覆盖至模式空间:
G:从保持空间取出内容追加至模式空间:
x:把模式空间中的内容与保持空间中的内容进行互换:
n:读取匹配到的行的下一行至模式空间: 进行覆盖原来的模式空间的内容 `n`命令的作用是输出当前模式空间的内容(如果没加`-n`的话),然后读取下一行到模式空间。但是这里用了`-n`,所以自动输出被抑制了
N:追加匹配到的行的下一行至模式空间: 并用换行符 \n 分隔。
d:删除模式空间中的行:
D:删除多行模式空间中的所有行,,,D命令删除模式空间中的第一部分直到第一个换行符,然后重新开始循环,而不读取新的输入行。
h: hold [address[,address]]h 将pattern space中的内容拷贝到hold space中,原来的hold space里的内容被清除。
H: hold [address[,address]]H 将pattern space中的内容append到hold space\n后。
g: get [address[,address]]g 将hold space ( 保留空间 保持空间 ) 中的内容覆盖到pattern space中,原来pattern space里的内容清除。
G: get [address[,address]]G 将hold space ( 保留空间 保持空间 ) 中的内容添加到pattern space\n后。
x: exchange 交换保持空间和模式空间的内容。
n: next 读取匹配到的行的下一行至模式空间,同时覆盖本行
N: next 追加匹配到的行的下一行至模式空间,此时模式空间有两行,当前行和下一行
d: delete 删除模式空间中的一行
D: delete 删除模式空间中的多行(所有行),,,,D命令删除模式空间中的第一部分直到第一个换行符,然后重新开始循环,而不读取新的输入行。
任何一行读完之后不会再读第二次
一次时处理多个命令 使用分号隔开
sed -n "n;p" FILE 显示偶数行 见 /node-admin/22289
sed '1!G;h;$!d' FILE 逆向显示文件内容, 行倒序输出, 相当于 tac 倒序输出 # 见 /node-admin/22284
sed '$!N;$!D' FILE 取文件的最后两行 相当于 tail -2 FILE (显示文件后两行) (没看懂) # 见 /node-admin/22291
sed '$!d' FILE 取文件的最后一行 #不是最后一行的删除掉 # 见 /node-admin/22285
sed 'G' FILE 文件的每一行后面加个空白行 (因为保持空间默认是空白的)
sed 'g' FILE 每一行全部替换为空白行
sed '/^$/d;G' FILE 空白行删除后,每一行后面再加个空白行 (没看懂)
sed 'n;d' FILE 显示奇数行 (没看懂) #把偶数行删掉 见 /node-admin/22288
sed -n '1!G;h;$p' FILE 逆向显示文件内容, 行倒序输出, 相当于 tac 倒序输出 (没看懂)
sed -i -n '1!G;h;$p' test.txt (-i就保存到原文件里了)
[root@localhost ~]# sed 's@r..t@&er@' /etc/passwd (显示了全部的内容)
[root@localhost ~]# sed -n 's@r..t@&er@' /etc/passwd
[root@localhost ~]# sed -n 's@r..t@&er@p' /etc/passwd (把匹配到的行,被替换的行进行显示,用p)
rooter:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/rooter:/sbin/nologin
ftp:x:14:50:FTP User:/var/fterp:/sbin/nologin
[root@localhost ~]#
[root@localhost ~]# vim test.txt
[root@localhost ~]# sed -n 'n;p' test.txt
2
4
6
8
10
[root@localhost ~]#
[root@localhost ~]# sed '1!G;h;$!d' test.txt
6
5
4
3
2
1
[root@localhost ~]# sed '$!N;$!D' test.txt
5
6
[root@localhost ~]# sed '$!d' test.txt
10
[root@localhost ~]#
[root@localhost ~]# sed 'G' test.txt
[root@localhost ~]# sed 'g' test.txt
[root@localhost ~]# vim test.txt
[root@localhost ~]# sed '/^$/d;G' test.txt 把空白行删除,然后每一行下面加个空白行
# vim test.txt
[root@localhost ~]# sed 'n;d' test.txt (显示奇数行)
1
3
5
7
9
[root@localhost ~]#
[root@localhost ~]# sed -n '1~2p' test.txt (显示奇数行)
[root@localhost ~]#
[root@localhost ~]# sed -n '2~2p' test.txt (显示偶数行)
[root@localhost ~]#
[root@localhost ~]# sed '1!G;h;$p' test.txt
[root@localhost ~]# sed -n '1!G;h;$p' test.txt
[root@localhost ~]# sed -i -n '1!G;h;$p' test.txt (-i就保存到原文件里了)
[root@localhost ~]# cat test.txt