sed命令全面解析

  • Post author:
  • Post category:其他


作用

  • sed命令是一个

    非交互式的行文本编辑器

    ,它能对文件内容进行编辑,默认每次处理文本文件中所

    匹配到一行内容到模式空间

    ,然后用后面的命令进行操作,操作完成之后,会把

    模式空间里面的内容输出到屏幕

    上,然后把

    模式空间中的内容删除

    ,同时把

    下一行所匹配到的内容读入模式空间

    内,依次循环,直到读取完整个文件。
  • sed 命令处理的是

    缓冲区中的内容

    ,其实这里的缓冲区,就是

    模式空间

语法

  • sed [options] ‘address command’ file
  • sed [options] -f [scripefile] file

对以上的几个英语字符进行说明:

  • options为选项,其中sed支持的选项会在下面的

    选项

    小结说明
  • address : 相当于匹配的条件,会在

    地址

    中进行说明
  • command为命令,相当于一个参数,放在地址后面,具体见下面的

    命令

    小节说明
  • file :为文本文件


需要说明的是,使用时address和command会挨在一起,中间没有空格,上面语法中间加空格是为了说明这是两个部分

以下为sed命令的工作流程图:


选项

这里的选项就是指sed之后的options,常见的选项具体如下:

-e ,–expression=script

以选项中指定的script参数来处理文本文件,可以指定多个命令

-f file,–files=script

以文件中的指定的参数来处理文本文件



-n ,–quiet ,–slient

取消默认输出,sed默认会输出所有文本内容,使用-n参数后只显示处理过的行



-r ,–regexp-extended

支持扩展正则表达式



-i,–in-place[=SUFFIX]


直接修改文件内容


地址

这里的地址就是语法格式中的address部分,是在单引号里的前一部分 。


替换标记说明

linenumber指定特定行号

startline,endline指定起始行号和结束行号

linenumber,+nn为数字,表示从指定行号向后n行

/pattern/已正则表达式表示的匹配模式

/pattern1, /pattern2/从模式匹配1到模式匹配2

/pattern/,x在给定行号上查询包含模式的行

x,/pattern/通过行号和模式查询匹配的行

x,y!查询不包含指定行号x和y的行


命令

这里的指令就是command,这个一般放在单引号内,同时和要处理的字符放在一起,只是command放在字符的前面。

a 追加,向匹配行后面插入内容

i 插入,向匹配行前插入内容

c 更改,更改匹配行的内容

d 删除,删除匹配行的内容

s 使用替换模式替换相应模式

s/patten/newstring 替换,把patten匹配到的内容换成newstring

p 打印,打印出匹配的内容,通过与-n选项配合使用

q 退出命令

= 标号,用来将匹配的行前标号

n 读取下一行,遇到n会自动自动跳入下一行

r 将内容读入文件

{} 命令间的传递,类似于管道符|

w 将匹配内容写入文件

W 将匹配到行的第一行,保存到file中。


替换标记

  • g : 表示将匹配到的内容进行全局替换 。
  • \1 :表示前面第一个左括号所表示的内容 ,\2表示前面第二个左括号中表示的内容,依次类推
  • & : 表示前面匹配到的内容


正则匹配

正在匹配在上面已经介绍到,详情请见正则表达式介绍。具体见:Grep

实例


以下主要针对地址指令的实战练习

先准备数据文件aa.txt,通过cat查看aa.txt文件内容

  • 显示文件中的第2行内容

sed -n ‘2p’ aa.txt

-n ,–quiet ,–slient

取消默认输出,sed默认会输出所有文本内容,使用-n参数后只显示处理过的行

2   linenumber指定特定行号

p   打印,打印出匹配的内容,通过与-n选项配合使用

  • 删除文件中3~13行

sed ‘3,16d’ aa.txt

sed ‘3,+13d’ aa.txt

  • 删除匹配boot的行

sed ‘/boot/d’ aa.txt

  • 删除以d开头的行

sed ‘/^d/d’ aa.txt

  • 打印匹配以d开头到以l开头的行(多次匹配)

sed -n ‘/^d/,/^l/p’ aa.txt

  • 打印dev到第5行,其中不包含第5行

sed -n ‘/dev/,5p’ aa.txt  /pattern/,x在给定行号上查询包含模式的行

  • 打印第2行到匹配到dev之间的行

sed -n ‘2,/dev/p’ aa.txt  x,/pattern/通过行号和模式查询匹配的行x,y!查询不包含指定行号x和y的行

  • 除3~16行之间的数据,将其它数据输出

sed -n ‘3,16!p’ aa.txt   x,y!查询不包含指定行号x和y的行


以下主要正则正则匹配的实战练习:

先准备数据文件,通过cat命令查看java.conf文件

  • 过滤掉注释的行,备注:注释的行是以#开头

sed -n ‘/^#/!p’ java.conf

  • 过滤掉所有的空行

sed -n ‘/^$/!p’ java.conf  先通过^$取空,再取反

  • 过滤掉所有注释行和空行,此命令用到{},不清楚的可参考上面的命令

sed -n ‘/^#/!{/^$/!p}’ java.conf   {} 命令间的传递,类似于管道符|

  • 删除掉所有注释行和空行,(这里的删除并非对源文件内容进行删除)

sed -e ‘/^#/d’ -e ‘/^$/d’ java.conf

  • 匹配任何包含JVM的行

sed -n ‘/JVM_.*/p’ java.conf

特殊字符

所谓特殊字符,就是一些有特殊含义的字符,如上面说的 runoo*b 中的 *,简单的说就是表示任何字符串的意思。如果要查找字符串中的 * 符号,则需要对 * 进行转义,即在其前加一个 \,runo\*ob 匹配字符串

runo*ob

许多元字符要求在试图匹配它们时特别对待。若要匹配这些特殊字符,必须首先使字符”转义”,即,将反斜杠字符\ 放在它们前面。下表列出了正则表达式中的特殊字符:

特别字符 描述
$ 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 ‘\n’ 或 ‘\r’。要匹配 $ 字符本身,请使用 \$。
( ) 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 \( 和 \)。
* 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。
+ 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+。
. 匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 \. 。
[ 标记一个中括号表达式的开始。要匹配 [,请使用 \[。
? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?。
\ 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, ‘n’ 匹配字符 ‘n’。’\n’ 匹配换行符。序列 ‘\\’ 匹配 “\”,而 ‘\(‘ 则匹配 “(“。
^ 匹配输入字符串的开始位置,除非在方括号表达式中使用,当该符号在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合。要匹配 ^ 字符本身,请使用 \^。
{
标记限定符表达式的开始。要匹配 {,请使用 \{。
| 指明两项之间的一个选择。要匹配 |,请使用 \|。

  • 匹配包含JNI_LIBDIR或者JVM_ROOT的行

sed -rn ‘/(JVM_ROOT|JNI_LIBDIR)/p’ java.conf

-r ,–regexp-extended

支持扩展正则表达式

  • 匹配任何包含数字的行

sed -n ‘/[[:digit:]]/p’ java.conf

字符簇 描述
[[:alpha:]] 任何字母
[[:digit:]] 任何数字
[[:alnum:]] 任何字母和数字
[[:space:]] 任何空白字符
[[:upper:]] 任何大写字母
[[:lower:]] 任何小写字母
[[:punct:]] 任何标点符号
[[:xdigit:]] 任何16进制的数字,相当于[0-9a-fA-F]


以下主要针对各命令的练习,如s,i,a,r,w,p等

  1. 将含有aaa字符的第一个字符a 替换成b.

sed -n ‘s/a/b/p’ info  替换匹配到的第一个   s/patten/newstring 替换,把patten匹配到的内容换成newstring

  1. 将含有aaa的字符替换成bbb.

sed -n ‘s/a/b/pg’ info   g表示将匹配到的内容进行全局替换 。

  1. 替换第二行内容中的root为test,注意是第一个匹配到的root字符。以及替换从2,3行所有的root字符串,替换第二行到最后一行的root为test(全局替换)

sed ‘2,3s/root/test/g’ aa.txt  sed ‘2,$s/root/test/g’ aa.txt   $匹配输入字符串的结尾位置。

  1. 在匹配See字符的行,行首添加hello

sed -n  ‘/See/s/^/Hello/p’ java.conf,为什么命令是这样,由于如果s放到前面,则直接进行进行替换了,因此先进行匹配,然后使用s对开头进行替换

  1. 在匹配See字符的行,在See字符后添加hello,在See字符前添加hello

sed -n  ‘/See/s/See/& Hello/p’ java.conf   sed -n  ‘/See/s/See/Hello &/p’ java.conf   &表示前面匹配到的内容

  1. 在匹配See字符的行,在行尾添加hello,在开头添加hello

sed -n  ‘/See/s/$/Hello/p’ java.conf  sed -n  ‘/See/s/^/Hello/p’ java.conf

  1. 在匹配ddd字符的行的前面一行添加hello

sed ‘/aaa/i hello’ info      插入,向匹配行前插入内容

  1. 在匹配ddd字符的行的后面一行添加hello

sed ‘/aaa/a hello’ info

  1. 将一个新行添加到文件的第三行。

sed ‘1a\hello’ info

  1. 查询boot的行是在第几行

sed -n ‘/boot/=’ aa.txt   = 标号,用来将匹配的行前标号

以上所有的替换或变化都不会改变原文件的内容 。

  1. 将文件info中的ccc修改为xyz。

sed -i ‘s/aaa/bbb/’ info   向匹配行前插入内容,使用会更改原文件

  1. 将文件info中匹配到tmp的行,其中包含root的字符修改为test .

sed -i ‘/tmp/s/root/test/g’ aa.txt  除了/作为界定符,@,#也可以作为界定符

  1. 在匹配kkk的行的结尾添加end字符 。

sed -i ‘/usr/s/$/ end/g’ aa.txt

  1. 直接替换文件中第三行的内容。

sed -i ‘3c\this is line’ aa.txt

  1. 将指定文件abc.txt中的内容插入到info文件的第三行

sed ‘1r aa.txt’ info

  1. 将文件info中的前两行输出到文本文件aa.txt。

sed ‘1,2w aa.txt’ info

  1. 将info中匹配boot的行写入到aa.txt中

sed ‘/bbb/w aa.txt’ info

  1. 读取文件a.sh中的指令进行替换xxx为hello world .

sed -f a.sh file



版权声明:本文为wht1995316原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。