sed命令是一个面向字符流的非交互式编辑器,也就是说sed不允许用户与它进行交互操作。sed是按行来处理文本内容的。
首先谈一下sed常用的常用格式为:sed[选项] [动作]。
常用选项:
-n:使用安静(silent)模式。在一般sed的用法中,所有崽子STDIN的数据一般都会会被列出到终端上。但如果加上-n参数后,则只有经过sed特殊处理的那一行(或者动作)才会被列出来。
-e:直接在命令列模式上进行sed的动作编辑。
-f:直接将sed的动作写在一个文件内,-f filename则可以运行filename内的sed动作。
-r:sed的动作支持是延伸性正规表示法的语法。(默认是正规表示法语法)。
-i:直接修改读取的文件内容,而不是输出到终端。
function
a:新增行,a的后面可以是字串,而这些字串会在新的一行出现(目前的下一行)。
c:取代行,c的后面可以接字串,这些字串可以取代n1,n2之间的行。
d:删除行,因为是删除,所以d后面通常不接任何参数,直接删除地址表示的行。
i:插入行,i的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)。
p:列印,亦即将某个选项的数据印出。通常p会与参数sed -n一起运行。
s:替换,可以直接进行替换的工作,通常这个s的动作可以搭配正规表示法,例如1,20s/old/new/g一般是替换符合条件的字符串而不是整行。
一般function的前面会有一个地址的限制。例如[地址] function,表示我们的动作要操作的行。下面我们通过具体的离职直观的看看sed的使用方法。
// test.txt 内容如下
11 aa
22 bb
33 cc
44 dd
55 2e
删除行(不替换文件,只是打印到控制台上面)
sed '1,2d' test.txt 表示删除第1行到第2行的内容。
sed '1,$d' test.txt 表示删除第1行到最后一行的内容。
sed '/2/d' test.txt 表示删除包含2的所有行。
sed '/^2/d' text.txt 表示删除以2开头的所有行。
新增行(不替换文件,只是打印到控制台上面)
sed '1a hello world' text.txt 表示在第1行的后面添加一行,添加的内容就是"hello world"。
sed '1i hello world' text.txt 表示在第1一行的前面添加一行,添加的内容是"hello world"。
替换行(不替换文件,只是打印到控制台上面)
sed '1c hello world' text.txt 表示将第1行的内容替换为"hello world"。
sed '/^2/c hello world' text.txt 表示将以2开头的行全部替换为"hello world"。
替换部分字符串而不是整行(不替换文件,只是打印到控制台上面)
sed中除了上面的命令是针对证行进行操作的之外,还提供一个替换明明,该命令对某一行中的部分字符串进行操作,下面举一个简单的例子,还是同样的文本内容,执行下面的命令:
sed 's/aa/AA/' text.txt 表示将文件中的aa替换为AA。s/待替换的字符串/新字符串/。这里只置换每一行遇到的第一个aa。
sed 's/aa/AA/g' text.txt 表示将文件中的aa替换为AA,加入g选项之后,表示为全局替换。
sed '1s/aa/AA/g' text.txt 表示将文件中的第1行的aa进行替换。
sed '5,$s/aa/AA/g' text.txt 表示将文件中第5行到末尾进行替换。
sed '/^[0-9]/s/aa/AA/g' text.txt 表示将文件中以数字开头的行进行替换操作。
搜索并输出行内容(不替换文件,只是打印到控制台上面)
sed -n '2p' text.txt 表示输出第2行。
将修改应用到文件中(替换文件)
上面举的例子都没有修改文件里面的内容,只是将修改结果打印到控制台上面,而文件是没有修改的。
我们可以使用-i选项告诉sed直接修改文件的内容,而不是将修改结果输出到控制台上面。
sed -i '2d' text.txt 结果之前文件中的第二行没有了
sed正则中的元字符
我们知道sed中的命令前面可以使用地址范围进行限制,表示对文件的某些符合条件的行执行相应的操作,其中我们可以使用正则表达式选出想要操作的行,而sed中的正则语法可能与其他命令的正则语法有一些不同,这里面我们列出来sed中常用的正则。
$ 表示行尾
^ 表示行首
[a-z0-9] 表示字符范围
[^]表示出了字符集中的字符以外的字符
sed 的正则中\(\)和{\m,n\}需要转义
. 表示任意字符
* 表示零个或者多个
\+ 一次或者多次
\? 零次或者一次
\| 表示或语法