sed是linux行文本处理命令,默认选项是-e
➜ sed --help
用法: sed [选项]... {脚本(如果没有其他脚本)} [输入文件]...
-n, --quiet, --silent
取消自动打印模式空间
-e 脚本, --expression=脚本
添加“脚本”到程序的运行列表
-f 脚本文件, --file=脚本文件
添加“脚本文件”到程序的运行列表
--follow-symlinks
直接修改文件时跟随软链接
-i[SUFFIX], --in-place[=SUFFIX]
edit files in place (makes backup if SUFFIX supplied)
-c, --copy
use copy instead of rename when shuffling files in -i mode
-b, --binary
does nothing; for compatibility with WIN32/CYGWIN/MSDOS/EMX (
open files in binary mode (CR+LFs are not treated specially))
-l N, --line-length=N
指定“l”命令的换行期望长度
--posix
关闭所有 GNU 扩展
-r, --regexp-extended
在脚本中使用扩展正则表达式
-s, --separate
将输入文件视为各个独立的文件而不是一个长的连续输入
-u, --unbuffered
从输入文件读取最少的数据,更频繁的刷新输出
-z, --null-data
separate lines by NUL characters
--help
display this help and exit
--version
output version information and exit
如果没有 -e, --expression, -f 或 --file 选项,那么第一个非选项参数被视为
sed脚本。其他非选项参数被视为输入文件,如果没有输入文件,那么程序将从标准
输入读取数据。
sed 命令
行为命令
行为命令为sed匹配到指定的行后的操作,多个操作用;
进行间隔:
!
,反向选取:
,声明标签a
,向下新增一行数据b
,跳转标签,需要在标签前c
,替换匹配行d
,删除匹配行g
,将保持空间复制到模式空间G
,将保持空间追加到模式空间h
,将模式空间的值复制到保持空间H
,将模式空间的值追加到保持空间i
,向上新增一行数据n
,读取下一行到追加到模式空间,相当于模式空间有两行数据,但后续操作只会影响新读取的行N
,读取下一行到追加到模式空间,与原有数据合并成一行,后续操作会影响新的一行p
,打印匹配行q
,退出r
,从文件读取输入行s
,替换,按照规则替换匹配行中的字符串,附加命令g
表示行内全部替换w
,将所选的行写入文件x
,将模式空间和保持空间互换y
,将字符替换为另一个字符
操作对象
操作对象表示sed匹配的行
- 数字,表示指定行,用
,
隔开表示连续的行 $
,表示最后一行//{}
,之间的内容进行正则匹配,对匹配的行进行{}
的操作,也可以不用{}
,直接使用简化的行为命令也可以,还可以和数字一起使用,例如/^s/,10p
,打印第一个以s
开头的行到第10行
sed正则表达式
正则操作符,用于匹配复杂的行
^
,行首匹配$
,行尾匹配.
,匹配除换行符外的任意字符*
,贪心匹配,即匹配前一字符零次或多次,匹配直到最后出现的一次?
,非贪心匹配,即匹配零次或一次[]
,匹配任一字符[^]
,不能匹配到任一字符\(\)
,保存已匹配的字符,最多可匹配9次,编号为1到9,通过\1来引用&
,表示已匹配的行\<
,词首定位符\>
,词尾定位符\{n\}
,匹配前一字符出现n次\{n,\}
,匹配前一字符至少出现n次\{n,m\}
,匹配前一字符至少出现n次,但不超过m次
模式空间与保持空间
上面的操作都是在默认的模式空间中进行的,sed为了能够同时处理多行数据,提供了保持空间。
模式空间是指,匹配到一行后执行相应的操作,然后模式空间清空,直到文件处理完毕。
保持空间是指,存储指定数据,可以通过行为命令将模式空间的数据覆盖、追加、互换操作。
实现tac
➜ seq 3 | sed -n '1!G;h;$p'
3
2
1
模式空间读入第一行,将模式空间复制到保持空间,删除模式空间
模式空间读入第二行,将保持空间追加到模式空间,将模式空间复制到保持空间,删除模式空间
其他行重复第二行的操作
模式空间读入最后一行,将保持空间追加到模式空间,将模式空间复制到保持空间,打印模式空间
实现xargs
➜ seq 3 | sed -n 'H;${x;s/\n/ /g;p}'
每一行都将模式空间追加到保持空间,最后一行将模式空间和保持空间数据对换,替换所有换行符为空格,打印模式空间。
正常情况下sed按行处理文本,是不会读到换行符,可以通过这种方式获取带换行符的多行数据。
标签
在sed脚本中:
表示声明一个标签,b表示跳转标签。利用标签可以实现类似循环的操作。
实现xargs
➜ seq 3 | sed ':a;N;$!ba;${s/\n/ /g}'
设置标签a,读取下一行,与原有数据当做一行,不是最后一行跳转到标签a,直到最后一行,不跳转到标签a,替换所有的换行符为空格,sed自动打印模式空间内容