写在前面:

    博客书写牢记5W1H法则:What,Why,When,Where,Who,How。


本篇主要内容:

● sed 命令用法


sed

   stream editor for filtering and transforming text

   sed会将整行读取到模式空间(pattern space),在模式空间进行处理后,根据处理动作进行操作(默认输出),直到读取新的行,将模式空间的原有行覆盖,除非手动干预。而模式空间的内容也可以转移到保留空间,保留空间可以保留更多行,以供其他操作。

   sed [OPTION]... {script-only-if-no-other-script} [input-file]...

      OPTION

         -n, --quiet, --silent:取消默认的打印行为

         -e script, --expression=script:指定一个新的表达式,可以有多个同时使用

         -f script-file, --file=script-file:指定脚本文件

         -i[SUFFIX], --in-place[=SUFFIX]:直接修改原文件内容

         -c, --copy:与-i一起使用,修改原文件的同时,将未修改的文件复制一份并命名为“原文件名+c”

         -r, --regexp-extended:支持正则表达式

         -z, --null-data:以空字符(null)分割行。可以指定此选项,来保证只处理第一个找到的行


      script:

         [地址定界] [字符处理或整行处理]

         中间以空格隔开,可以多个空格

         地址定界:

            空:每一行

            #:指定某行

            #,#...:指定某几行

            #,+#:从第#行开始的,往后#行

            $:最后一行

            1~2:从第1行开始,步进为2。即所有奇数行

            5,~3 :从第5行开始,直到3的第一个整数倍的行停止

            /regexp/ 或 \0regexp0:正则表达式匹配的行,"0"也可替换为其他字符

            #,/PAT1/:从第#行开始,知道匹配到PAT1的行

            /PAT1/,/PAT2/:从匹配到PAT1的行开始,到匹配到PAT2的行结束

         整行处理:

            仅对匹配空间的行进行处理操作。

            = :显示行号。会在行的前面新建一行行号

            a \TEXT :在匹配到的行的下方插入一行,内容为TEXT。"/"标记TEXT的开头。

            i \ :在匹配到的行的上方插入一行,内容为TEXT。"/"标记TEXT的开头。

            q [退出码] :执行完本行处理后立即退出。如果给出退出码,则将退出码设置为指定退出码。

            Q [退出码] :不执行本行处理,直接退出。如果给出退出码,则将退出码设置为指定退出码。

            r FILENAME :读取FILENAME的内容,并插入到匹配行的行后

            R FILENAME :读取FILENAME的内容,并一行行插入到匹配行的行后。如第1个匹配到的行的行后只会插入文件的第1行,第2个匹配到的行行后插入文件的第2行。


            c \TEXT :替换匹配行的内容为TEXT

            d :删除匹配到的行

            h H :读取/追加模式空间内容到保留空间

            g G :读取/追加保留空间内容到模式空间

            n N :读取/追加下一行到模式空间

            p :打印当前模式空间内容


            w filename :将模式空间内容另存为filename文件


         字符处理:

            s/regexp/replacement/ :替换匹配到的行的指定字符串

            y/source/dest/ :单字符替换

实例:

-z选项用法:
(一)
[root@localhost ~]# echo -e "hello fred\nhello" | sed  "s:hello:222:" 
222 fred
222
[root@localhost ~]# echo -e "hello fred\nhello" | sed -z "s:hello:222:" 
222 fred
hello
(二)
[root@localhost ~]# cat t.txt
123
skldfjksladfjsdf
123111111111
[root@localhost ~]# sed "s:123:tttttttttttt:" t.txt
tttttttttttt
skldfjksladfjsdf
tttttttttttt111111111
[root@localhost ~]# sed -z "s:123:tttttttttttt:" t.txt
tttttttttttt
skldfjksladfjsdf
123111111111


  #为每一行行后都添加一行

[root@www ~]# cat test.txt 
1 23
123456
124356
echo123
[root@www ~]# sed 'a             new line' test.txt 
1 23
new line
123456
new line
124356
new line
echo123
new line
[root@www ~]# sed 'a    \   new line' test.txt 
1 23
   new line
123456
   new line
124356
   new line
echo123
   new line


  #查找特定行并指定退出码退出

[root@www ~]# sed '/^123/q4' test.txt 
1 23
123456
[root@www ~]# echo $?
4
[root@www ~]# sed '/^123/Q18' test.txt 
1 23
[root@www ~]# echo $?
18


  #将file的内容追加到test.txt的尾部

[root@www ~]# cat > file << eof
> this is line1.
> eof
[root@www ~]# sed '$rfile' test.txt 
1 23
123456
124356
echo123
this is line1.


  #获取"ip addr show"的输出,并用sed得到IP和掩码

[root@www ~]# ip addr show > ipinfo 
[root@www ~]# sed -n '/[[:space:]]\+inet /s:[^0-9]*\([0-9.]\+\/[0-9]\+\).*:\1:p' ipinfo
127.0.0.1/8
172.18.31.7/16
172.18.252.42/16


  #高级用法实例

sed  -n  'n;p'  FILE     #显示偶数行;
sed  '1!G;h;$!d'  FILE     #逆序显示文件的内容;
sed  ’$!d'  FILE     #取出最后一行;
sed  '$!N;$!D' FILE     #取出文件后两行;
sed '/^$/d;G' FILE     #删除原有的所有空白行,而后为所有的非空白行后添加一个空白行;
sed  'n;d'  FILE     #显示奇数行;
sed 'G' FILE     #在原有的每行后方添加一个空白行;