跳转至

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 的动作可以搭配。
回到页面顶部