sed 命令
2017-04-19 by dongnan
目标
整理很早以前 shell
脚本学习资料,发现的 sed
的学习笔记,记录一下。
举个栗子
提示:数据无价,操作前请先备份数据。
注意: -i
参数会直接修改源文件,谨慎使用此参数。
替换
# 匹配 WWW 并用 WEB代替
sed -i 's/WWW/WEB/' test.txt
# 匹配每一行,把'' 添加到文本文件行头部
# 注意:单引号与双引号, 注意:g 表示全局替换,如果不是用g 将只匹配每行的第一个。
sed -i "s/^/''/g" test.txt
# 删除行头部的空格(一个或者多个)
sed -r -i 's/^[ ]+//' test.txt
# 在行尾替换内容
sed -r -i 's/$/ stat/' test.txt
新增&插入
# 在正则匹配行的下面添加一行
sed -i '/export/a export PATH=$PATH:/usr/local/apache/bin' /etc/profile
# 在正则匹配行的上面添加一行 注意 i\
sed -i '/shell>/i\ ' test.txt
# 直接在最文件末尾添加一行文本,注意 a\
sed -i '$ a\/usr/local/apr-util/lib' /etc/ld.so.conf
sed -i '$,/export/ a\export PATH=$PATH:/usr/local/nginx/sbin' /etc/profile
列出
# 输出匹配的行。
# 注意: -n 取消默认的输出 ---因为默认sed是会对档案进行默认的输出的。
sed -n '/\/usr\/local.*\/sbin/p' /etc/profile
sed -n '/\/usr\/local\/.*/p' /etc/ld.so.conf
sed -n '/^ $/p' test.txt
# 输出指定的行,例如:1到2行
sed -n '1,2p' /etc/passwd
sed -n '1,/bin/p' /etc/passwd
删除
# 删除匹配的 /urs/local/bin 这一行, 注意 /d 。
sed -i '/\/usr\/local\/nginx\/sbin/d' /etc/profile
# 删除空行
sed -i '/^$/d' sed.txt
# 删除以空格或者制表符开头的行
sed -i -r '/^sda/d' sed.txt
sed -i -r '/^(\s|\t)/d' sed.txt
# 删除指定的行
sed -i '1 d' sed.txt
sed -i '1,2 d' sed.txt
# 删除最后一行,注意 $ 符号
sed -i '$ d' sed.txt
其它
# 分组,()分组与没有使用括号分组,完成的功能一样
sed -r 's/[ ]+//g;s/(^\|)|(\|$)//g' sed.txt
sed -r 's/([ ]+)?\|//g;s/ //;/\+/d' sed.txt
# 用分号';'分割两个表达式。
sed -r -i '/^$/d;s/^(\s|\t|#)+//g;' sed.txt
# 匹配词首词尾
\< \>
帮助
sed [选项] [动作]... {脚本(如果没有其他脚本)} [输入文件]...
-n, --quiet, --silent
取消自动打印模式空间
-e 脚本, --expression=脚本
添加“脚本”到程序的运行列表
-f 脚本文件, --file=脚本文件
添加“脚本文件”到程序的运行列表
--follow-symlinks
直接修改文件时跟随软链接
-i[SUFFIX], --in-place[=SUFFIX]
直接编辑文件,edit files in place (makes backup if SUFFIX supplied)
-l N, --line-length=N
指定“l”命令的换行期望长度
--posix
关闭所有 GNU 扩展
-r, --regexp-extended
在脚本中使用扩展正则表达式
-s, --separate
将输入文件视为各个独立的文件而不是一个长的连续输入
-u, --unbuffered
从输入文件读取最少的数据,更频繁的刷新输出
-z, --null-data
separate lines by NUL characters
--help 打印帮助并退出
--version 输出版本信息并退出
如果没有 -e
, --expression
, -f
或 --file
选项,那么第一个非选项参数被视为 sed
脚本。
其他非选项参数被视为输入文件,如果没有输入文件,那么程序将从标准输入读取数据。
动作说明
[n1[,n2]]function
n1, n2
不见得会存在,一般代表『选择进行动作的行数』。
举例来说,如果我的动作是需要在 10 到 20 行之间进行的,则 10,20
。
- a∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)。
- i∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)。
- c∶取代, c 的后面可以接字串,这些字串可以取代
n1,n2
之间的行! - d∶删除,因为是删除,所以 d 后面通常不接任何字符。
- p∶列出,亦即将某个选择的资料印出。通常 p 会与参数
sed -n
一起运作。 - s∶替换,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配。