linux-sed命令


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自动打印模式空间内容

参考文献


文章作者: djaigo
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 djaigo !
评论
  目录