linux sed流编辑器示例讲解

本文结构

  • sed简介
  • sed命令格式
  • sed选项
  • sed用法示例

一、sed是什么?

sed编辑器被称作流编辑器(stream editor),跟普通交互式文本编辑器正好相反,它是用来过滤和进行文本转换的。
流编辑器会在编辑数据之前基于预先提供的一组规则来编辑数据流

sed原理:sed以文本的行为单位进行处理,一次处理一行内容。首先sed把当前处理的行存储在临时缓冲区中(称为模式空间pattern space),接着处理缓冲区中的行,处理完成后,把缓冲区的内容送往屏幕。sed处理完一行就将其从临时缓冲区删除,然后将下一行读入,进行处理和显示,这样不断的重复,直到文件末尾。处理完文件的最后一行后,sed便结束运行。

因为sed是对文件中每行在临时缓冲区中的副本进行编辑,所以原文件内容并没有改变,除非重定向输出。

二. sed命令格式

sed [OPTION]... {script-only-if-no-other-script} [input-file]...
#sed [选项]... {脚本} [文件]...

三. sed参数解释

   -e script, --expression=script
          为将要执行的命令添加脚本

   -f script-file, --file=script-file
          添加脚本文件的内容给将要执行的文件

   --follow-symlinks
          但程序执行时追随连接

   -i[SUFFIX], --in-place[=SUFFIX]
          在适当的位置编辑文件(如果后缀提供的话做好备份)

   -c, --copy
          当在 -i模式下移动文件的时候使用副本而不是重命名


   -l N, --line-length=N
          为l命令明确指定换行的长度是多少

   --posix
          关闭所有GUN扩展

   -r, --regexp-extended
          在脚本中使用扩展后的正则表达

   -s, --separate
          将文件时为分开的而不是一个单一持续长数据流

   -u, --unbuffered
          从输入文件中家在最小数量的数据,频繁刷新输出缓存

   -z, --null-data
          用NUL字符分割行

四. sed用法示例:

1.替换部分内容

[root@foundation36 ~]# echo halo the wooo | sed 's/woo/world ya/'
halo the world yao
[root@foundation36 ~]# 

2.sed执行多条命令,参数 -e

hello the word
[root@foundation36 ~]# sed -e 's/halo/hello/; s/word/world ya/' time.txt
hello the world ya

3.多条命令写入脚本调用文件执行,假设文件名称为sedcom

sed -f sedcom file
-n选项和p命令一起使用表示只打印那些发生替换的行:
sed -n 's/test/TEST/p' file
sed -i 's/book/books/g' file

4.全局替换
使用后缀 /g 标记会替换每一行中的所有匹配:
sed ‘s/book/books/g’ file

echo sksksksksksk | sed 's/sk/SK/2g' 
skSKSKSKSKSK 

echo sksksksksksk | sed 's/sk/SK/3g'
skskSKSKSKSK

echo sksksksksksk | sed 's/sk/SK/4g'
skskskSKSKSK

5定界符
以上命令中字符 / 在sed中作为定界符使用,也可以使用任意的定界符:

 sed 's:test:TEXT:g' sed 's|test|TEXT|g' 

定界符出现在样式内部时,需要进行转义:

sed 's/\/bin/\/usr\/local\/bin/g'

6.删除操作:d命令

    删除空白行:
    sed '/^$/d' file
    删除文件的第2行: sed '2d' file
    删除文件的第2行到末尾所有行: sed '2,$d' file
    删除文件最后一行: sed '$d' file
    删除文件中所有开头是test的行: sed '/^test/'d file

7.组合多个表达式
sed ‘表达式’ | sed ‘表达式’ 等价于:
sed ‘表达式; 表达式’

8.选定行的范围:,(逗号)

所有在模板test和check所确定的范围内的行都被打印:
sed -n '/test/,/check/p' file
打印从第5行开始到第一个包含以test开始的行之间的所有行
sed -n '5,/^test/p' file
对于模板test和west之间的行,每行的末尾用字符串aaa bbb替换: 
sed '/test/,/west/s/$/aaa bbb/' file

9.多点编辑:e命令

-e选项允许在同一行里执行多条命令:
sed -e '1,5d' -e 's/test/check/' file

上面sed表达式的第一条命令删除1至5行,第二条命令用check替换test。命令的执行顺序对结果有影响。如果两个命令都是替换命令,那么第一个替换命令将影响第二个替换命令的结果。
和 -e 等价的命令是 --expression:
sed --expression='s/test/check/' --expression='/love/d' file

10.变形
y命令
把1~10行内所有abcde转变为大写,注意,正则表达式元字符不能使用这个命令:

sed '1,10y/abcde/ABCDE/' file

11.打印奇数行或偶数行
方法1

 sed -n 'p;n' test.txt #奇数行
 sed -n 'n;p' test.txt #偶数行

方法2:

 sed -n '1~2p' test.txt #奇数行
 sed -n '2~2p' test.txt #偶数行 

12.打印匹配字符串的下一行

grep -A 1 SCC URFILE
sed -n '/SCC/{n;p}' URFILE 
awk '/SCC/{getline; print}' URFILE

你可能感兴趣的:(linux,shell)