shell三剑客之sed基本语法,干货满满

目录

1.  sed的工作原理

2.  sed的基本语法

3.  模式空间中的编辑操作

4.  示例演示


1.  sed的工作原理

        sed是一种流编辑器,它是文本处理中非常有用的工具,能够完美的配合正则表达式使用,处理时,把当前处理的行存储在临时缓冲区中,称为模式空间,接着用sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变。
        

sed 的特点:
(1) sed 命令是将一系列的编辑命令应用于一批文本的理想工具。
(2) sed 命令是一个非交互式的文本编辑器,它可以对来自文本文件以及标准输入的文本进行编辑。其中,标准输入可以是来自键盘、文件重定向、字符串、变量或者是管道的文本。
(3) sed 命令会从文件或者标准输入中一次读取一行数据,将其复制到缓冲区(最多 8192 节),然后读取命令行或者脚本的编辑子命令,对缓冲区中的文本行进行编辑。重复此过程,一直到所有的文本行都处理完毕。

2.  sed的基本语法

sed OPTIONS… [SCRIPT] [INPUTFILE…]
常用的选项:
-n --quiet --silent :不输出模式空间中的内容,使用安静模式,在一般 sed 的用法中,所有来自
STDIN 的数据一般都会被列出到屏幕上,但如果加上 -n 参数后,则只有经过 sed 特殊处理的那一行才会被
列出来;
-i :直接编辑原文件,而不是由屏幕输出,默认不对原文件进行操作;
-e :直接在命令行模式上进行 sed 的动作编辑,多个子命令之间也可以用分号隔开; sed - e
'command1 ; command2... filename 或者 sed - e 'command1' - e 'command2' ……filename
-r :使用扩展正则表达式;
-f :直接将 sed 的动作写在一个文件内, -f filename 则可以执行 filename 内的 sed 动作。

3.  模式空间中的编辑操作

         3.1  地址定界
1) # # 为数字,指定要进行处理操作的行; 1 ,表示第一行;
2) $ :表示最后一行,多个文件进行操作的时候,为最后一个文件的最后一行;
3) /regexp/ :表示能够被 regexp 匹配到的行;
      regexp 即基于正则表达式的匹配;
4 /regexp/I :匹配时忽略大小写;
5 \%regexp%: 任何能够被 regexp 匹配到的行,换用 % (用其他字符也可以,如: # )为边界符号;
6 addr1,addr2 :指定范围内的所有的行(范围选定);
        常用地址定界表示方式:
        a) 0 /regexp/ :从起始行开始到第一次能够被 regexp 匹配到的行。
        b) /regexp/,/regexp/ :被模式匹配到的行内的所有的行。
7 first~step :指定起始的位置及步长,例如: 1~2 表示 1,3,5…
8 addr1,+N :指定行以及以后的 N 行;
     addr1,~N:将匹配addr1和addr1之后的行,直到输入行号为N的倍数的下一行。
                        m,~n   m<=n时,作用和m,+n一样     m>n时, 匹配m-n行 
注意事项:
        
        1、如果没有指定地址,表示命令将应用于每一行
        2、如果只有一个地址,表示命令将应用于这个地址匹配的所有行
        3、如果指定了由逗号分隔的两个地址,表示命令应用于匹配第一个地址和第二地址之间的行 ( 包括这两行)
        4、如果地址后面跟有感叹号,表示命令将应用于不匹配该地址的所有行
        3.2  常用编辑命令
1 d :删除匹配到的行
2 p :打印当前模式空间内容
3 a \text append, 表示在匹配到的行之后追加内容
4 i \text insert, 表示在匹配到的行之前追加内容
5 c \text change, 表示把匹配到的行和给定的文本进行交换
6 s/regexp/replacement/flages :查找替换 , 替换 regexp 匹配到的内容(其中 / 可以用其他字符代替, 例如@
其他编辑命令:
        常用的flages
        g:全局替换,默认只替换第一个
        i: 不区分大小写
        p:如果成功替换则打印
7 r 读入文件内容追加到匹配行后面
8 R 读入文件一行内容追加到匹配行后面
9 y y/source/dest/ 固定长度替换,要求替换的字符串长度相等
10 w /path/to/somefile :将匹配到的文件内容追加到指定的文件末尾

4.  示例演示

先创建一个演示文件,并用以下编辑命令对其操作

[root@localhost test]# vim test_text
  1 hello china 1
  2 hello chongqing 2
  3 hello shaanxixian 3
  4 hello guandong 4
  5 hello zhejiang 5
  6 fuck japan 6
  7 fuck korea 7

#: d命令    删除第#行

 
i \text命令        -i:直接编辑原文件,而不是由屏幕输出,默认不对原文件进行操作;

 
c \text命令         c \text change, 表示把匹配到的行和给定的文本进行交换

#,#: p命令           'n,m  p '打印n到m行到模式空间并打印输出当前模式空间里的类容,加上"-n"可以不用打印输出未被匹配到的行
p :打印当前模式空间内容
-n --quiet --silent :不输出模式空间中的内容,使用安静模式,在一般 sed 的用法中,所有来自
STDIN 的数据一般都会被列出到屏幕上,但如果 加上-n参数 后,则 只有经过sed特殊处理的那一行才会被列出来

#~#: s/pattern/string        以第1行开始,步长为2匹配,将匹配到的那一行的第一个hello替换为hi

#,+N: s/pattern/string/g   第#行及其后面n行,匹配到的每个pattern替换为string
g :全局替换,默认只替换第一个

#,~N: d命令
addr1,~N :指定行开始的 N 行;

 
$:d命令          删除最后一行

$ :表示最后一行,多个文件进行操作的时候,为最后一个文件的最后一行;

/regexp/ : a \text               

 /regexp/:表示能够被regexp匹配到的行;

a \text append, 表示在匹配到的行之后追加内容

#,/regexp/ : s/pattern/string/g         将第#行和第#行后第一次匹配到regexp的行的pattern替换为string

 #/regexp/:从第#行开始到第一次能够被regexp匹配到的行。

[root@localhost test]# sed '2,/hello/ s/hello/hi/' test_text 
hello china 1
hi chongqing 2
hi shaanxixian 3
hello guandong 4
hello zhejiang 5
fuck japan 6
fuck USA 7
[root@localhost test]# sed '0,/hello/ s/hello/hi/' test_text 
hi china 1
hello chongqing 2
hello shaanxixian 3
hello guandong 4
hello zhejiang 5
fuck japan 6
fuck USA 7
[root@localhost test]# sed '3,/hello/ s/hello/hi/' test_text 
hello china 1
hello chongqing 2
hi shaanxixian 3
hi guandong 4
hello zhejiang 5
fuck japan 6
fuck USA 7
[root@localhost test]# vim test_text 
[root@localhost test]# sed '2,/hello/ s/hello/hi/' test_text 
hello china 1
hi chongqing 2
cccc
hi shaanxixian 3
hello guandong 4
hello zhejiang 5
fuck japan 6
fuck USA 7
/regexp/, /regexp/: s/pattern/string/g
/regexp/,/regexp/ :被模式匹配到的行内的所有的行。
s/regexp/replacement/flages :查找替换 , 替换 regexp 匹配到的内容
g :全局替换,默认只替换第一个
        为了方便比较全局替换,对创建的文件改进了以点点
[root@localhost test]# more test_text 
hello china 1
hello chongqing 2
hello shaanxixian 3
hello guandong 4 hello
hello zhejiang 5
fuck japan 6
fuck USA 7

测试:

game over

猜你喜欢

转载自blog.csdn.net/weixin_62107875/article/details/126535524