linux 三剑客之sed

linux 三剑客之sed用法之十大案例

###本文结构:概述+基本用法+实例

一、sed概述:

sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。sed处理文本时以行为单位。

二、基本用法:

sed + 选项 + “指令” 文件

常用选项:
-e   --它告诉sed将下一个参数解释为一个sed指令,只有当命令行上给出多个sed指令时使用
-f   --后跟保存了sed指令的文件
-i   --直接对内容进行修改,不加 i 时默认只是预览,不会对文件进行实际修改
-n   --取消默认输出,sed默认会输出所有文本内容,使用 -n 参数后只显示处理过的行

编辑命令:

  • a 在匹配行后面插入文本
  • i 在匹配行前面插入文本
  • c 把匹配的行改为新的文本
  • d 删除,删除选择的行
  • D 删除模板块的第一行
  • s 替换指定字符
  • h 拷贝模板块的内容到内存中的缓冲区
  • H 追加模板块的内容到内存中的缓冲区
  • g 获得内存缓冲区的内容,并替代当前模板块中的文本
  • G 获得内存缓冲区的内容,并追加到当前模板块文本的后面 l 列表不能打印字符的清单
  • n 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令
  • N 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码
  • p 打印模板块的行
  • P(大写) 打印模板块的第一行
  • q 退出Sed
  • b lable 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾
  • r file 从file中读行
  • t label if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾
  • T label 错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾
  • w file 写并追加模板块到file末尾
  • W file 写并追加模板块的第一行到file末尾
  • ! 表示后面的命令对所有没有被选定的行发生作用
  • = 打印当前行号码。

三、实用案例

1. sed命令的 -n 选项()

案例1: 打印所需要的行、行号

 sed -n '1p' file.txt	#打印第1行
 sed -n '1,6p' file.txt	#打印第1行至第6行
 sed -n '1p;6p' file.txt	#打印第1行、第6行
 sed -n '1p;3p;6p;7p' file.txt	#打印第1行、第3行、第6行、第7行

 sed -n 'p;n' file.txt          # 奇数行
 sed -n 'n;p' file.txt          # 偶数行
 sed -n '1~2p' file.txt         # 奇数行
 sed -n '2~2p' file.txt         # 偶数行
 
 sed -n '/test/,/check/p' file.txt # 所有在模板test和check所确定的范围内的行都被打印
 sed -n '5,/^test/p' file.txt # 打印第五行开始到第一个包含以test开头的行之间的所有行
 
  sed -n '/test/,/check/p' file.txt # 所有在模板test和check所确定的范围内的**行号**被打印
 sed -n '5,/^test/p' file.txt # 打印第五行开始到第一个包含以test开头的行之间的所有**行号**
 
 sed '/test/,/west/s/$/aaa bbb/' file.tx t# 对于模板test和west之间的行,每行的末尾用字符aaa bbb替换
 
案例2: 替换文件内容(有-i 表示在原文件中修改,无-i则不影响原文件)

sed  's/book/books/' file.txt      # 将file文件中每一行的第一个book替换为books
sed  's/book/books/g' file.txt     # 替换file文件每一行中的所有匹配
sed  's/book/books/2g' file.txt    # 从file每一行第二个匹配的开始替换,当需要从第N处匹配开始替换时,可以使用/Ng

案例3:定界符 (案例2命令中字符 / 在sed中作为定界符使用,也可以使用其他的任意定界符)

sed 's/test/TEXT/g' file.txt             # 以/作为定界符
sed 's:test:TEXT:g' file.txt             # 以:作为定界符
sed 's|test|TEXT|g' file.txt             # 以|作为定界符
# 定界符出现在式样内部时,需要进行转义
sed 's/\/bin\/bash/bin/g' file.txt          # 将/bin/bash替换为bin

案例4 删除操作:d命令

sed '/^$/d' file.txt          # 删除空白行
sed '2d' file.txt             # 删除第二行
sed '$d' file.txt             # 删除最后一行
sed '2,$d' file.txt           # 删除第二行到最后一行
sed '/^test/d' file.txt           # 删除所有以test开头的行
sed '/test$/d' file.txt           # 删除所有以test开头的行

案例5 匹配字符串标记、子字符串标记、变量引用

#匹配字符串标记
#输入:
echo this is a test line | sed 's/\w\+/[&]/g'
#结果:
[this] [is] [a] [test] [line]

#输入
sed 's/^192.168.01/&localhost/' file.txt # 所有以192.168.01开头的行都会被替换成自己加上localhost
#结果
192.168.01localhost


#匹配子字符串标记
#输入
echo this is digit 7 number | sed 's/digit \([0-9]\)/\1/'
#结果
this  is 7 number  #命令中digit 7 被替换成了7。样式匹配到的子串是7,\(\)用于匹配子串,

#输入
echo aaa bbb | sed 's/\([a-z]\+\) \([a-z]\+\)/\2 \1/'# 对于匹配到的子串第一个就标记为\1,以此类推,
#匹配到的第二个子串是\2
#结果
bbb aaa

#输入
sed -n 's/\(love\)able/\1rs/p' file.txt # 将loveable替换为lovers,并打印出来
#结果
lovers


#sed 表达式可以使用单引号来引用,但是如果表达式内部包含变量字符串,就需要使用双引号
test=hello
echo hello WORLD | sed "s/$test/HELLO/"
HELLO WORLD

案例6 组合多个表达式、-e命令

sed '1,5d' file.txt | sed 's/test/check/' 
sed '1,5d;s/test/check/' file.txt
sed -e '1,5d' -e 's/test/check/' file.txt
#以上输命令出结果相同
#删除1至5行,然后用check替换test。
#命令执行顺序对结果有影响,如果两个都是替换命令那么第一个替换命令将影响第二个替换命令的结果

案例7 前后追加命令

sed '/^test/a\this is a test line' file.txt  # 将this is a test line追加到以test开头的行的后面
sed -i '2a\this is a test line' file.txt  # 在test.conf文件第二行之后插入this is a test line
sed -i '3a\this is a test line' file.txt  # 在test.conf文件第三行之后插入this is a test line


sed '/^test/i\this is a test line' file.txt  # 将this is a test line 插入到以test开头的行的前面
sed '5i\this is a test line' file.txt  # 在第五行之前插入this is a test line
sed '7i\this is a test line' file.txt  # 在第七行之前插入this is a test line

案例8 文件读出、写入命令

# 读出文件:r命令
# file.txt里的内容被读进来,显示在与test匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面
sed '/test/r file.txt' test.txt
# 写入文件:w命令
# 在test.txt中所有包含test的行都被写入file里
sed -n '/test/w file.txt' test.txt

案例9 保持h、获取G、互换x命令

#sed处理文件的时候,每一行都被保存在一个叫模式空间的临时缓冲区中,除非行被删除或者输出被取消,否则所有被处理的行都将
#打印在屏幕上。接着模式空间被清空,并存入新的一行等待处理


sed -e '/test/h' -e '$G' file.txt
# 在这个例子里,匹配test的行被找到后,将存入模式空间,h命令将其复制并存入一个称为保持缓存区的特殊缓冲区内。
# 第二条语句的意思是,当到达最后一行后,G命令取出保持缓冲区的行,然后把它放回模式空间中,
#且追加到现在已经存在于模式空间中的行的末尾。
# 在这个例子中就是追加到最后一行。简单来说,任何包含test的行都被复制并追加到该文件的末尾。


sed -e 'test/h' -e '/check/x' file.txt         # 把包含test与check的行互换

案例10 y、n、q命令

sed '1,10y/abcde/ABCDE/' file.txt  #把1-10行内所有的abcde对应转变ABCDE,注意,正则表达式元字符不能使用这个命令

sed '10q' file.txt           # 打印完第十行后,退出sed

sed -n '/SCC/{n;p}' file.txt  #打印匹配字符串SCC的下一行

参考链接1
参考链接2
参考链接3

你可能感兴趣的:(ubuntu,linux,unix,服务器)