正则表达式和sed的基础知识

最近总想更新点什么,但是一直在学习minixml和一些C++知识,看项目代码,就没有更新。学习了不少知识,但是都是在网上看着别人写的在学,也不好意思自己在精简一下发上来有点照搬的感觉。

先发一些sed和正则表达式的基本概念,后续会更新一些较难的知识点和题目,请关注。大神请绕道。

转载请注明出处。

 

一个正式表达式是一个字符串   . 字符串里的字符被称为元字符   , 它们可能表示了比它们字面上看
起来的意思更丰富的含义   .
一个正则表达式包含下面一个或多个项   :
1.   一个字符集 .
这里的字符集里的字符表示的就是它们字面上的意思   . 正则表达式最简单的情况就是仅
仅由字符集组成   , 而没有其他的元字符 .
2.   .
一个锚指明了正则表达式在一行文本中要匹配的位置   , 例如 ^   $ 就是锚   .
3.   修饰符
它们用于展开或缩小   ( 即是修改了 )   正则表达式匹配文本行的范围   . 修饰符包括了星号 .
括号和反斜杠符号   .
正则表达是的主要作用是用来文本搜索和字串操作   . 一个正则表达式匹配一个字符或是一串字
-- 完整的一串字符或是另外一个字符串的子串   .

*       匹配前一个字符的任意多次包括零次。 
          exam: “112233*”匹配1122    11223    112233333  1122345等
.         匹配除了新行符之外的任一个字符
           exam:“12.”匹配12+至少一个任意字符,所以匹配1122,11222但是不匹配12
^        匹配一行的开头,但是依赖上下文环境,可能在正则表达式中表示否定一个字                    
          符集的意思
$         在正则表达式中匹配行尾。
           “^$”匹配空行
[]         [...] --   在正则表达式中表示匹配括号中的一个字符   .
          "[xyz]"   匹配字符 x, y,   z.
         "[a-z]"   匹配从字符a z 之间的任意一个字符   .
         "[a-tu-y]"   匹配从a   t   或从   u   y   的任意一个字符   .
          "[^b-d]"   匹配除了从 b   d   范围内所有的字符   .这种情形就不是匹配开始为b到          
          d的任意字符了。
\          转义   (escapes)   一个特殊的字符 , 使这个字符表示原来字面上的意思   .
          exam:”\$“用于表示“$”而不是匹配行尾。\<\>用于表示单词的边界这是必须          
          被转义。
?        匹配零或一个前面的字符   .   它一般用于匹配单个字符   .
+         匹配一个或多个前面的字符   . 它的作用和 *   很相似 , 但唯一的区别是它不
           匹配零个字符的情况   .     
\{ \}      指示前面正则表达式匹配的次数   .
           exam:"[0-9]\{5\}"   精确匹配 5   个数字   (   0     9   的数字 ).注:大括号不能在                                                       awk中使用
( )         括起一组正则表达式 .
         " "   正则操作符用于匹配一组可选的字符

POSIX   字符类 .
 [:class:]
这是另外一个可选的用于指定匹配字符范围的方法   .
[:alnum:]   匹配字母和数字 . 等同于   A-Za-z0-9.
[:alpha:]   匹配字母 .   等同于 A-Za-z.
[:blank:]   匹配一个空格或是一个制表符   (tab).
[:cntrl:]   匹配控制字符 .
[:digit:]   匹配 (   十进制 ) 数字   .   等同于 0-9.
[:graph:] ( 可打印的图形字符 ).   匹配   ASCII   码值的 33 - 126   之间的字符 .   这和下面提到的
[:print:] 一样 ,   但是不包括空格字符   .
[:lower:]   匹配小写字母 .   等同于   a-z.
[:print:] ( 可打印字符 ).   匹配   ASCII   码值   32 - 126   之间的字符 .   这和上面提到的一样
[:graph:], 但是增多一个空格字符 .
[:space:]   匹配空白字符   ( 空格符和水平制表符   ).
[:upper:]   匹配大写字母 .   等同于   A-Z.
[:xdigit:]   匹配十六进制数字 .   等同于   0-9A-Fa-f.

常用选项:
        
-n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
        -e∶直接在指令列模式上进行 sed 的动作编辑;
        -f∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;
        -r∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
        -i∶直接修改读取的档案内容,而不是由萤幕输出。       

常用命令:
        a   ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
        c   ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
        d   ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
         i   ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
         p  ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~
         s  ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!

附: 这里简介一下单引号和双引号的区别
在一个双引号中直接使用变量名   , 一般都是没有问题的 . 它阻止了所有在引号中的特殊字符的 重新解释   -- 包括变量名 [2]--   但是 $,`   \ 除外 .[3]   保留 $, 作为特殊字符的意义   , 是为了能够在双 引号中也能够正常地引用变量   ("$var").

单引号操作总体上和   "" 很像 ,   但不允许引用变量   . 因为 $   的特殊含义被关闭了   . ''   中除了 ', 其他 字符都没有特殊的含义了   . 所以单引号比双引号严格   .
exam:
[root@localhost lzj]# s="i am liuzhijian"
[root@localhost lzj]# echo "$s"
i am liuzhijian
[root@localhost lzj]# echo '$s'
$s


下面举一些联系的例子
exam:
[root@localhost lzj]# cat > textfile
This is line 1, of which there is only one instance.
This is the only instance of line 2.
This is line 3, another line.
This is line 4.

[root@localhost lzj]# grep 'the' textfile
This is line 1, of which there is only one instance.
This is the only instance of line 2.
This is line 3, another line.

[root@localhost lzj]# grep '\<the\>' textfile
This is the only instance of line 2.

sed全名叫stream editor,流编辑器,用程序的方式来编辑文本。主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作
[root@localhost lzj]# cat my.txt
This is my cat, my cat's name is betty
This is my dog, my dog's name is frank
This is my fish, my fish's name is george
This is my goat, my goat's name is adam


[root@localhost lzj]# sed '1d' my.txt  #删除第一行
This is my dog, my dog's name is frank
This is my fish, my fish's name is george
This is my goat, my goat's name is adam

[root@localhost lzj]# sed '$d' my.txt  #删除最后一行
This is my cat, my cat's name is betty
This is my dog, my dog's name is frank
This is my fish, my fish's name is george 

[root@localhost lzj]# sed '3,$d' my.txt  #删除第三行到最后一行
This is my cat, my cat's name is betty
This is my dog, my dog's name is frank

[root@localhost lzj]# sed -n '$p' my.txt #显示最后一行
This is my goat, my goat's name is adam 

[root@localhost lzj]# sed -n '/cat/p' my.txt  #显示cat所在行
This is my cat, my cat's name is betty 

[root@localhost lzj]# sed "1a This is my sheep,my sheep's name is tony" my.txt   #在第一行后增加字符串,注意这里使用双引号,单引号里面‘是有特殊含义的
This is my cat, my cat's name is betty
This is my sheep,my sheep's name is tony
This is my dog, my dog's name is frank
This is my fish, my fish's name is george
This is my goat, my goat's name is adam

[root@localhost lzj]# sed -i '$a Thanks' my.txt  #在最后一行插入Tanks
[root@localhost lzj]# cat my.txt  
This is my cat, my cat's name is betty  
This is my dog, my dog's name is frank  
This is my fish, my fish's name is george  
This is my goat, my goat's name is adam
Thanks

这里要说一下正则表达式的/g:
/g意思就是:global可选标志,带这个标志表示替换将针对行中每个匹配的串进行,否则则只替换行中第一个匹配串
[root@localhost lzj]# sed 's/^/#/g' my.txt       #在每一行最前面加
#This is my cat, my cat's name is betty 
#This is my dog, my dog's name is frank 
#This is my fish, my fish's name is george 
#This is my goat, my goat's name is adam
#Thanks


[root@localhost lzj]# sed 's/my/his/g' my.txt   #将每一行的my替换为his
This is his cat, his cat's name is betty  
This is his dog, his dog's name is frank  
This is his fish, his fish's name is george  
This is his goat, his goat's name is adam
Thanks

[root@localhost lzj]# sed 's/my/his/' my.txt  #没有g的替换,只替换了第一个my
This is his cat, my cat's name is betty  
This is his dog, my dog's name is frank  
This is his fish, my fish's name is george  
This is his goat, my goat's name is adam
Thanks

[root@localhost lzj]# sed '3,$s/my/his/g' my.txt  #替换第3行到最后一行的my为his
This is my cat, my cat's name is betty  
This is my dog, my dog's name is frank  
This is his fish, his fish's name is george  
This is his goat, his goat's name is adam
Thanks

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值