1、正则表达式
通俗来讲,正则表达式是一种字符串的匹配方式,比如使用星号“*”来匹配任意的字符等。正则表达式实际上是一个匹配模板,当bash执行这个正则表达式时,就会将所有的输入数据与匹配模板匹配,匹配不成功的数据将会被过滤掉。
表1.常用的元字符
字符 |
含义 |
举例 |
. |
匹配除换行符以外的任意字符 |
\bhi\b.*\bLucy\b |
\w |
匹配字母或数字或下划线或汉字 |
\bhe\w |
\s |
匹配任意的空白符(包括空格制表符换页符) |
|
\b |
匹配单词的开始或结束 |
\bhi\b |
^ |
匹配字符串的开始 |
^g.*d$ |
$ |
匹配字符串的结束 |
grep ‘d$’ test.ini |
表2.常用的限定符
字符 |
含义 |
举例 |
* |
重复零次或更多次 |
grep ‘o*’tet.ini |
+ |
重复一次或更多次 |
[0-9]+匹配1个或更多的数字 |
? |
重复零次或一次 |
|
{n} |
重复n次 |
^9{2}$ |
{n,} |
重复n次或更多次 |
|
{n,m} |
重复n到m次 |
|
表3.常用的反义代码
/语法 |
说明 |
\W |
匹配任意不是字母,数字,下划线,汉字的字符 |
\S |
匹配任意不是空白符的字符 |
\B |
匹配不是单词开头或结束的位置 |
[^x] |
匹配除了x以外的任意字符 |
[^aeiou] |
匹配除了aeiou这几个字母以外的任意字符 |
表4.扩展正则表达式
字符 |
含义 |
举例 |
{n,m} |
等同于基本正则表达式的\{n,m\} |
egrep –n ‘9{1,3}’ tmp |
+ |
匹配前面一个字符出现一次或多次 |
egrep –n ‘go+d’ tmp |
? |
匹配前面一个字符出现零次或一次 |
egrep –n ‘go+d’ tmp |
| |
匹配逻辑或者,即匹配|前或后的字符串 |
egrep –n ‘adm|ftp’ tmp egrep –n ‘(n|f)tp’ tmp |
() |
匹配正则集合 |
sed 's/\(root\)\(.*\)\(bash\)/\hei\2\hello/' tmp |
2、sed工具
当用sed命令对文本进行处理的时候,sed先读取对象的文本文件的第一行到模式空间中。
当有内容进入“模式空间”时,sed的编辑命令对模式空间中的内容进行编辑操作(修改,替换,删除,追加,显示等等)
模式空间中的内容编辑处理完成之后,sed把此内容通过标准输出(默认为显示器)打印出来,并删除模式空间中的内容。
第一行处理结束。从新读取第二行的内容进行处理,直到最后一行。
2.1.sed基本语法
Sed [参数选项] {脚本指令} [输入文件]
2.2. sed的命令和选项:
命令 |
功能描述 |
a\ |
在当前行的后面加入一行或者文本。 |
c\ |
用新的文本改变或者替代本行的文本。 |
d |
从pattern space位置删除行。 |
i\ |
在当前行的上面插入文本。 |
h |
拷贝pattern space的内容到holding buffer(特殊缓冲区)。 |
H |
追加pattern space的内容到holding buffer。 |
g |
获得holding buffer中的内容,并替代当前pattern space中的文本。(替换最后一行) |
G |
获得holding buffer中的内容,并追加到当前pattern space的后面。(追加到最后一行) |
n |
读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。 |
p |
打印pattern space中的行。 //小写 |
P |
打印pattern space中的第一行。 //大写 |
q |
退出sed。 |
w file |
写并追加pattern space到file的末尾。 |
! |
表示后面的命令对所有没有被选定的行发生作用。sed '/ftp/!a hello' tmp |
s/re/string |
用string替换正则表达式re。 |
= |
打印当前行号码。 |
替换标记 |
|
g |
行内全面替换,如果没有g,只替换第一个匹配。 |
p |
打印行。 |
x |
互换pattern space和holding buffer中的文本。 sed -e '/adm/h' -e '/ftp/x' tmp |
y |
把一个字符翻译为另一个字符(但是不能用于正则表达式)。Sed ‘y/a/A/’ tmp |
选项 |
|
-e |
允许多点编辑。 |
-n |
取消默认输出。 |
-f |
直接将sed的动作写在一个文件内 |
-i |
直接修改文件内容,而不是输出到终端 |
-r |
Sed的扩展表达式的用法 |
2.2.1.新增
在某一行后面加入新内容
sed ‘/匹配项/a\新增项’文件名
匹配某一行,在这行前面加入新内容
sed ‘/匹配项/i\新增项’文件名
在某一行的后面加入新内容
sed ‘3a 新增项’文件名
匹配某一行,在这行前面加入新内容
sed ‘3i 新增项’文件名
匹配某一行,在某一行的后面读入某文件的内容
sed ‘/匹配项/r 新增文件’ 文件名
匹配某一内容,并将该内容写到其他文件中
Sed ‘/匹配项/w 其他文件名’文件名
删除所有空行并在每一行的后面增加一个空行
sed ‘/^$/d;G’ 文件名
匹配某一行,把这一行加到所有行的后面
sed ‘/匹配项/h;G’文件名
2.2.2.替换
匹配某一内容并将该行第一个该内容替换
sed ‘s/匹配项/替换项/’文件名
匹配某一内容并全部替换该内容
sed ‘s/匹配项/替换项/g’文件名
匹配某一内容,并将该行内的另一内容替换
sed ‘/匹配项1/s/匹配项2/替换项2/’文件名
匹配某一项,并将含有该内容的整行替换
sed ‘/匹配项/c\替换项’文件名
2.2.3.删除
删除第几行
sed ‘3d’文件名
sed ‘$d’文件名
匹配某一行并删除
sed ‘/匹配项/d’文件名
删除第几行到第几行
sed ‘2,5d’文件名
删除文中所有字母
sed ‘s/[a-zA-Z]//g’文件名
删除文中所有数字
sed ‘s/[0-9]//g’文件名
删除文中的基数行
sed '1~2d' tmp
注意:如果要直接修改文件,则加入参数-i
3、总结
本文主要整理了正则表达式与sed的基本用法,后续将继续整理awk的基本用法。
来源:oschina
链接:https://my.oschina.net/u/2337373/blog/612829