RUI个人博客 首页>>Linux>>[原] Linux 正则表达式 sed命令 printf function a新增 i插入 c取代 d删除 p打印 sed脚本

[原] Linux 正则表达式 sed命令 printf function a新增 i插入 c取代 d删除 p打印 sed脚本

视频地址:video[21].swfvideo[22].swfvideo[23].swfvideo[24].swf
目录:
1. linux正则表达式  sed命令    搜索特定的字符串
2. printf ‘打印格式’实际内容
3. ?:上一个执行命令所回传的值     $:表示当前shell的进程号
4.sed工具  一个非交互式文本流编辑器,必须通过行号或正则表达式指定要改变的行
    4.1 调用sed的方式:命令行键入命令 、将sed命令插入脚本文件,然后调用sed  、 将sed命令插入脚本文件,并使sed脚本执行
    4.2 sed [-nef] [动作]   -n   -e   -f   
    4.3 function    a新增   i插入   c取代   d删除   p打印   s取代  
    4.4 sed编辑命令   p  =  a\  i\   d  c\  s  r   w  q   l  {}   n   g   y   n   G   &
    4.5 使用p(rint)显示行
    4.6 如果需要对同一个文件或同一行进行多次修改,可以有三种方法:-e    分号;  多行
    4.7 创建sed脚本
    4.8 替换地
  
1. linux正则表达式  sed命令    搜索特定的字符串

    · 搜索特定字符串
    · 使用 [] 搜索字符。^在字符集合符号([])代表反向选择,在[] 之外则代表定位在行首
    · 行首与行尾字符 ^ $
    · 任意一个字符。(绝对有一个字符) 与 重复字符 * (前面的字符是 0 个或多个)

    · 限定连续重复字符范围 {}

特殊字符 意义
^word 搜寻 word 这个字符串,[并且 word 必需为这一行的行首]
word$ 搜寻 word 这个字符串,并且 word 必需为这一行的行尾
   · 这是 [.] 在正规表达式当中很常用,代表的是 [一个] 任意字符,
不是 0 个也不是多个,恰恰好就是 [ 一个]。
[root@RAC1 tmp]# cat -n passwd 
[root@RAC1 tmp]# grep '^[a-z]' passwd
// 搜索首字母以a-z开头的行

\ 转义符将特殊字符变成普通字符
* 将前面的字符重复 0 次或多次 
[range] 进代表一个待搜索的字符
[^range] 反向选择,与 [range] 相反
\{n\}
重复前一个相同字符 n 个
\{n,m\}
重复前一个相同字符 n-m 个
\{n,\}
重复前一个相同字符 n 个以上
[root@RAC1 tmp]# grep 'g..d' passwd
//搜索以g..d开头的字符串(.表示一个任意字符) 
[root@RAC1 tmp]# grep 'n*y' passwd    
//搜索字符以n开头重复0次或多次的字符串

[root@RAC1 tmp]# grep '.' passwd 
[root@RAC1 tmp]# grep '\.' passwd  
 //使用 \ 进行转义  搜索包含 . 的字符串

[root@RAC1 tmp]# cat -n test
[root@RAC1 tmp]# grep 'go\{2\}g' test
//搜索以go开头重复o 2次及以上的字符串
[root@RAC1 tmp]# grep 'go\{2,5\}g' test
//搜索以go开头重复o 2次到5次的字符串
[root@RAC1 tmp]# grep 'go\{2,6\}g' test    
//搜索以go开头重复o 2次到6次的字符串
[root@RAC1 tmp]# grep 'go\{2,\}g' test    
//搜索以go开头重复o 2次及以上的字符串

注意:在万用字符当中, * 代表的是0 ~ 无线多个字符的意思,

但在正则表达式中,* 表示重复前一个字符0 ~ 无线多个的意思 ~使用的意义并不相同,不要搞混了

2. printf ‘打印格式’实际内容

[root@RAC1 tmp]# cat -n printftest  
//显示行号打印出内容

[root@RAC1 tmp]# printf '%7s %5i %5i %5i %5.2f \n' `cat printftest |grep -v 'Name'`
// 打印出第列为 7个字符   5位数字   5位数字    5位数字   5位数字   5位数字2个小数点
注:每列中间一个空格,如果多出的正常输出  
[root@RAC1 tmp]# printf '%7s %5i %5i %5i %8.2f \n' `cat printftest |grep -v 'Name'`

[root@RAC1 tmp]# printf '\x45'
//将45转换为字符 并且不换行
[root@RAC1 tmp]# printf '\x45\n'  
//将45转换为字符 并且输出新的一行

[root@RAC1 tmp]# printf '\x65\n'

3. ?:上一个执行命令所回传的值     $:表示当前shell的进程号
[root@RAC1 tmp]# echo $?  
返回0 表示正确执行
[root@RAC1 tmp]# ll /home/lll
[root@RAC1 tmp]# echo $?    
返回2 表示上一个命令没有正确执行

[root@RAC1 tmp]# echo $$
[root@RAC1 tmp]# ps

4.sed工具  一个非交互式文本流编辑器,必须通过行号或正则表达式指定要改变的行

      sed 是一个非交互式文本流编辑器,必须通过行号或正则表达式指定

要改变的行

       sed 如何读取数据: sed 从文件的一个文本行或从标准输入读取数据,将读取

的数据拷贝到一个编辑缓冲区,然后读命令行或脚本的第一条命令,并使用这些

查找模式或定位行号来编辑它。重复此过程直到命令结束。

    4.1 调用sed的方式:命令行键入命令 、将sed命令插入脚本文件,然后调用sed  、 将sed命令插入脚本文件,并使sed脚本执行

      调用sed的方式:

      * 在命令行键入命令      sed [选项] sed命令 输入文件

      * 将sed命令插入脚本文件,然后调用sed     sed [选项] -f sed脚本文件 输入文件

      * 将sed命令插入脚本文件,并使 sed 脚本执行    sed脚本文件 [选项] 输入文件

    4.2 sed [-nef] [动作]   -n   -e   -f

    sed [-nef] [动作]

  * 参数:

     * -n:不打印。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出

               到屏幕上。但如果加上 -n 参数后,则只有经过 sed 特殊处理的那一行才会显示出来。

     * -e:直接在指令行模式上进行 sed 的动作编辑;

     * -f :直接将 sed 的动作写在一个档案内,-f filename 则可以执行 filename 内的sed 动作;

     * 动作说明: [n1[,n2]]function

     * n1,n2 : 不一定存在,一般代表 【选择进行动作的行数】,比如,如果我的动作是

                需要在第 10 到 20 行之间进行的,那么动作是 【10,20[动作行为]】

    4.3 function    a新增   i插入   c取代   d删除   p打印   s取代  
a: 将前面的字符重复 0 次或多次 
[range] 进代表一个待搜索的字符
[^range] 反向选择,与 [range] 相反
\{n\}
重复前一个相同字符 n 个
\{n,m\}
重复前一个相同字符 n-m 个
\{n,\}
重复前一个相同字符 n 个以上
function 包含以下:
a:
新增,a 的后面可以接字符串,而这些字符串会在新的一行出现(添加行的下一行)
i:
插入,i 的后面可以接字符串,而这些字符串会在新的一行出现(添加行的上一行)
c:
取代,c 的后面可以接字符串,这些字符串可以取代 n1,n2之间的行
d:
删除,d 后面通常不接内容
p:
打印,亦即将某个选择的数据印出。通常p会与参数 n 一起使用
s:
取代,可以直接进行取代的工作!通常这个 s 的动作可以搭配正则表达式,例如 1,20s/old/new/g
使用 sed 在文件中定位文本的方式
x x 为一行号,如 1
x,y
表示行号范围从 x到y,如2,5 表示从第2行到第5行
/pattern/ 查询包含模式的行。例如 /disk/或 /[a-z]/
/pattern/pattern 查询包含两个模式的行,例如 /disk/disks
/pattern/,xx,/pattern
通过行号和模式查询匹配行。3,/study/
x,y! 查询不包含执行行号 x 和 y 的行。1,2!
    4.4 sed编辑命令   p  =  a\  i\   d  c\  s  r   w  q   l  {}   n   g   y   n   G   &

[root@RAC1 tmp]# cat -n test
[root@RAC1 tmp]# sed -n '/is/p' test     
 //显示包含is的行

[root@RAC1 tmp]# sed -n '/good/'p test  
//显示包含good的行

[root@RAC1 tmp]# sed -n '/t[ae]st/'p test
  //显示包含t[ae]st的行(tast 和 test)
[root@RAC1 tmp]# grep 't[ae]st' test 

[root@RAC1 tmp]# sed -n ' /^[a-z]/'p test  
//显示包含首字母为a-z小写字母的行
[root@RAC1 tmp]# grep '^[a-z]' test

[root@RAC1 tmp]# sed -n ' /!$/'p test  
显示以!结尾的行
[root@RAC1 tmp]# grep '!$' test 

[root@RAC1 tmp]# sed -n '/g..d/'p test    
//显示包含g..d的行
[root@RAC1 tmp]# sed -n '/\.$/'p test    
 //显示以 . 结尾的行(用到了转移 \ )

[root@RAC1 tmp]# sed -n '/go\{2\}g/'p test        
//显示包含两个o的行 goog........
[root@RAC1 tmp]# sed -n '/go\{2,\}g/'p test
 //显示包含2个或2个以上的行  goooo.......g.......

[root@RAC1 tmp]# cat -n test 
[root@RAC1 tmp]# cat -n test | sed '2a this line is append'  
//在第二行下  加入新行

[root@RAC1 tmp]# cat -n test | sed '2i this line is insert'    
//在第二行上面插入新行

[root@RAC1 tmp]# cat -n test | sed '2,3c this line is 2,3 line'    
//将第二行和第三行 用新行代替

[root@RAC1 tmp]# cat -n test | sed '2,8d'  
//将第二行到第八行 删除

[root@RAC1 tmp]# cat -n test | sed -n '1,8p'
 //将第一行到第八行打印出来
[root@RAC1 tmp]# cat -n test | sed -n '2p'  
 //将第二行打印出来

[root@RAC1 tmp]# sed -n '2p' test  
//将第二行打印出来
[root@RAC1 tmp]# sed -n '$p' test  
//将最后一行打印出来
[root@RAC1 tmp]# cat -n test | sed -n '$p'

[root@RAC1 tmp]# cat -n test | sed 's/is/IS/'    
//将每行首次出现的is替换成IS
[root@RAC1 tmp]# cat -n test | sed 's/is/IS/g'      
//将每行所有的is 替换成 IS

    4.5 使用p(rint)显示行

使用 p(rint) 显示行
sed -n '/name/p' file
sed -n 'n,/name/'p filename 从第 n 行向下搜索 name,搜索到第一个 name 停止
\ 可以转义特殊字符; $表示最后一行;.* 任意字符
打印行号 sed -n '/name/='filename
\{n,\}
[root@RAC1 tmp]# cat -n test | sed '/good/ a this line is append by good!'    
//在出现good的下面加入新行

[root@RAC1 tmp]# cat -n test | sed '/good/ i this line is insert by good!'  
//在出现good的上面插入新行

[root@RAC1 tmp]# cat -n test | sed -n '2,/is/'p test  
//从第二行开始查找 出现 is 停止查找

[root@RAC1 tmp]# cat -n test | sed -n '1,/is/'p test
//从第一行开始  但是第一行不会被匹配

[root@RAC1 tmp]# sed -n '/good/=' test
 //显示出现good的行号
[root@RAC1 tmp]# sed -n '/glad/=' test
//显示出现glad的行号

    4.6 如果需要对同一个文件或同一行进行多次修改,可以有三种方法:-e    分号;  多行
如果需要对同一文件或同一行进行多次修改,可以有三种方法:
   1. 使用 -e 参数  cat file|sed -e 's/old1/new1/' -e 's/old2/new2/'
   2. 使用分号   cat file|sed 's/old1/new1/;s/old2/new2/'
   3. 多行   cat file |sed '
   s/old1/new1/
   s/old2/new2/'
//显示出现glad的行号和内容
[root@RAC1 tmp]# sed -n -e '/glad/=' -e '/glad/p' test                    
[root@RAC1 tmp]# sed -n '/glad/=;/glad/p' test 
[root@RAC1 tmp]# sed -n '
> /glad/=
> /glad/p' test

//将 is 替换为  IS 将 am 替换成  WAS
[root@RAC1 tmp]# sed -e 's/is/IS/' -e 's/am/WAS/' test          
[root@RAC1 tmp]# sed 's/is/IS/g;s/am/WAS/' test 
[root@RAC1 tmp]# sed '
> s/is/IS/g
> s/am/WAS/' test


    4.7 创建sed脚本

创建 sed 脚本
vi allsed.sed
#!/bin/sed -f 
/good/ a\ 或行号 a\  /name/ ci\或 行号 ci\
This line is append 或 insert 或 change
chmod u+x/a+x/7** allsed 更改权限
./allsed filename 执行命令
删除d: sed '/name/d' filename 或 sed '1,3d' filename

[root@RAC1 tmp]# cat allsed.sed 
[root@RAC1 tmp]# ll allsed.sed 
[root@RAC1 tmp]# chmod u+x allsed.sed
//赋予脚本执行权限
[root@RAC1 tmp]# ll allsed.sed

[root@RAC1 tmp]# ./allsed.sed test
//出现good的后面加入新行

[root@RAC1 tmp]# cat allsed.sed
[root@RAC1 tmp]# ./allsed.sed test    
//出现glad的前面插入新行

[root@RAC1 tmp]# cat allsed.sed
[root@RAC1 tmp]# ./allsed.sed test  
 //将第二行和第三行替换

[root@RAC1 tmp]# cat allsed.sed 
[root@RAC1 tmp]# sed -f allsed.sed test     
//执行sed脚本

    4.8 替换地址   

[root@RAC1 tmp]# sed 's/is/IS/gw testnew' test
//将test文件中所有的 is 替换成 IS 并写入文件testnew中
[root@RAC1 tmp]# cat -n testnew

[root@RAC1 tmp]# sed '1G' test                    
//第一行后面加一个空行
[root@RAC1 tmp]# sed '/good/G' test     
//出现good行后面加入一个空行
[root@RAC1 tmp]# sed 's/great/man &/' test      
//&  用替换修改字符串  great前面加入man

[root@RAC1 tmp]# sed -n 's/great/xxxxxxx &/p' test

[root@RAC1 tmp]# sed -n '2,/is/'p test
[root@RAC1 tmp]# sed -n '1,/is/'p test

     ps: 写一篇博客需要一天,整理上传需要半天,希望以后真的有帮助吧。

  2016.10.20 于 北京邮储传    tyger.wang
昵  称:
邮  箱:
评论内容:
验 证 码:
可用[code][/code]插入代码
点击刷新验证码