SHELL学习笔录,正则表达式之旅_sed_awk

SHELL学习笔录,正则表达式之旅_sed_awk

斟酌正则表达式这几个东西:

SHELL学习笔录

sed是3个流式编辑器,每一回从stdin恐怕输入文件读取壹行,依照指令替换修改数据,并且输出到stdout,直到管理完全体的输入行。

本人想作为一个程序猿,正则表明式大家相对不生分。

 

sed的骨干选用:

sed options script file
options包括:

  • -e script。比方sed -e ‘s/red/black/;
    s/small/big/’,有八个指令的时候,命令之间用;分开。命令末尾和;之间不能够有空格
  • -f file。能够在file中增添四个sed命令,一行一条命令。

正则表达式好像二个零星则动机。首要作用是相配,但是同不经常间因为那个职能,大家得以扩张许多其它用法

前些时间学了学shell,做了些笔记,希望对好我们有所扶助,如下:

sed替换的模式

s/pattern/replacement/flags
flags包括:

  • [1-9]+: 替换第四回相配的地点
  • g:替换全体出现的地点
  • p:替换行的内容要求打字与印刷到stdout(能够结合sed -n,sed -n ‘s/a/b/p’
    test,那样就把test中被调换的行打字与印刷到了stdout)
  • w file:将替换结果写入文件

假定pattern只怕replacement中蕴藏/,能够由此/转义;大概用任何字符做分隔符:sed
‘s!/bin/bash!/bin/csh!’ /etc/passwd

像好多语言都引人了正则表达式:java,C#等面向对象语言,越来越多的是脚本语言。

 

sed的套路

sed首先供给显著成效于文本的怎么样行,无论是地点的交替还是上边要讲的去除/插入。鲜明效率行的为主格式是[address]command。假使须要在一行施行两个指令,格式则是[address]{command;
command},例如:sed ‘2{s/fox/bird/; s/cow/sheep/}’ test

除此以外大家常用的一对工具都引进了这一个正则表明式:sed,awk,gawk,grep

壹.echo “hello”    输出hello,自动打印换行符

数字艺术寻址

数字艺术中钦点的地方能够是单个数字行号,伊始行号、逗号以及末了行号内定的必然范围的行。举例:贰s/a/b/,叁,五s/a/b/,拾,$/s/a/b

总结我们的C语言,它这种引进了1有些基础的正则表明式,我们一会会合到:

 

文件情势过滤

地点通过pattern来钦点,正是/pattern/command。这里的pattern能够接纳正则。

正则表达式是用正则表达式引擎达成的。正则表明式引擎是表明正则表达式情势并选用这一个形式张开文字可能命令匹配的尾部软件

  echo “hello \c” 然echo不打字与印刷换行符 

sed的别的命令

学过编译原理的都知晓DFA,和NFA的定义,这是大家编写翻译进程中语法匹配的两大形式。他们的原理和正则表明式同样。

  echo *     展现全体文件,不包涵隐形文件 

删除

去除是d。前边说的[address]d,能够钦点删除的限量。别的,d还或然有一个特色,能够用多个pattern来钦赐删除的限定。
sed ‘/1/,/3/d’ test,正是从相称有壹的行删除到卓越有三的行。
万一有相称一的行,可是找不到特别有3的行,就能够从匹配壹的行开头删除直到截止。

正则表达式正是依附那样分类:大家之关怀Linux

  echo .*    展现隐藏文件 

插入

格式是sed ‘[address][i/a][\newline]+’

  • i,在钦定行以前插入3个新行。
  • a,在内定行之后插入四个新行。

在Linux,有二种流行的正则表明式引擎:

2.printf format-string[arguments]
差不离完结了C中printf的职能,它不像echo自动换行 

修改

sed ‘[patter]c\new line’
例如: sed ‘2c\test line’ text或者sed ‘/old lines/c\new line’ txt
内需专注的是,假使是sed ‘二,三c\new line’ txt,会把第叁行和第三行形成new
line,而不是独家替换第3行和第3行。

POSIX基本正则表明式引擎(BRE)

3.重定向 

替换

sed ‘[address]y/oldchars/newchars/’
oldchars和newchars的字符数必须壹致。oldchars中的字符会被替换到newchars中对应地方的字符。

POSIX扩大正则表明式引擎(ERE)

    <  更动专门的学业输入   program < file 将program的正统输入改为file 

打印行

sed ‘[address]p’,协作-n参数,能够只打字与印刷被轮换之后的行。
设若还要还亟需原始的行,能够那样sed ‘/pattern/p; s/pattern/new
content/p’ text

大繁多Linux工具都至少符合BRE

      >  改换职业输出   program > file
将program的标准输出改为file 

打字与印刷行号

sed ‘[address]=’

上面先看一下BRE基本成分,然后看看它在不一致地点的不等应用

                目的文件file不设有的时候,会新建file,若存在则会覆盖 

打字与印刷不可知符号

sed ‘[address]l’

BRE主要有1部分特殊字符组成:那么些特殊字符有:
.*[]^${}\+?|(),上边大家逐1学习:不过有好几新鲜:不能一直利用单斜线(/)要用反义字符表示包含除法符号(/)

                program >> file
 不掩盖已有file,而是把内容充实在file结尾处 

写入文件

w

1,锚字符

四.参数使用:  www.二cto.com  

读取文件内容并插入数据流

sed ‘[address]r data’ text

行首锁定:^  定义从数据流中文本行的行首初阶的格局。只可以是行首

    $n  第n个参数(和C中的宏类似,$n只是简单的代表,
 $n$m可构成为3个参数:) 

sed高端用法

行尾锁定:$定义了行尾锚点

    变量赋值”=”左右不能够有空格 

sed的空间

sed有七个空中,方式空间(pattern
space),情势空间是一块缓冲区,保存了当年要管理的公文;保持空间(hold
space),能够通过保持临时维持一些文本数据。

三种能够匹配 使用 到达特别的用处

5.通配符: 

n命令

n让sed移动到下1行
例如:

[root@iZ250bl4iyxZ tmp]# cat test.txt 
first line
test lines
test lines
test lines
[root@iZ250bl4iyxZ tmp]# sed '/first/{n; s/test/my/g}' test.txt 
first line
my lines
test lines
test lines

2,点字符

    *         相称几个字符 

N命令

N命令会把下1行也推入方式空间中(下壹回命令再实践的时候,从下下1行早先读取。)。那时候需求专注的是,在形式空间的多行中,它们中间的换行符依然存在。形式空间不包涵它里面最终1行的换行符。
例如

[root@iZ250bl4iyxZ tmp]# cat test.txt 
first line
test lines
test lines
test lines
[root@iZ250bl4iyxZ tmp]# sed '/first/{N; s/line/movie/g}' test.txt   
first movie
test movies
test lines
test lines

急需专注的是,假诺d命令的pattern相配上了形式空间中的大四一行,那么万事形式空间的富有行将被剔除。sed提供了D命令,只删除方式空间的首先行。同理,p命令打字与印刷整个方式空间,P命令只打印形式空间的率先行。
D命令有叁个非正规的性状:D Delete up to the first embedded newline in the
pattern space. Start next cycle, but skip reading from the input if
there is still data in the pattern space.
意味着壹旦合营N使用,乃至足以把整个文件放到格局空间,持续做多行相称。

.  用来协作除了换行符以外的即兴单字符

    ?        相称贰个字符 

维持空间的利用

  • h 把形式空间复制到保持空间
  • H 把方式空间附加到保证空间
  • g 把保持空间复制到形式空间
  • G 把保持空间附加到方式空间
  • x 交流保持空间和情势空间

3,字符数组

    [charset]  
 相配charset中的字符,如[0123456789]非常叁个数字012345678玖,还可写成[0-9] 

!命令

!命令效率于任何命令从前,让这一个命令起到相反的成效。
例如:!p表示不打字与印刷相配格局的行,打字与印刷别的不合营的行。$!N则代表对此最终1行不再append下一行到形式空间。

[] 能够在此数组中定义你想相配的妄动字符也可以上下合营使用用于交叉相配

    [!charset]    取charset的补集作为相称集结 

branch

[address]b label
在address行跳过前边的吩咐,直接跳转到label处。假设label为空,则跳转到脚本末尾。

[root@iZ250bl4iyxZ tmp]# cat test.txt 
this is panda.
that is house.
this is plane.
that is ship.
[root@iZ250bl4iyxZ tmp]# sed '/this/b lb; s/is/is not/g; :lb; s/\./!/g' test.txt 
this is panda!
that is not house!
this is plane!
that is not ship!

四,排除字符组

六.变量轮换: 

test命令

t(test)命令和b命令类似,可是它跳转是基于上一条命令是或不是成功匹配(实施)。

[^] 便是字符数组的反义词,相称的时候不相配数组中的字符

        ${parameter:-word}  
 若parameter为空或未设置,则用word取代parameter实行替换,parameter值不改变 

形式替换

5,区间:

        ${parameter:=word}  
 若parameter为空或未设置,则parameter设为值word 

&

&符号能够代替被相称的pattern

[root@iZ250bl4iyxZ tmp]# echo "this is a cat" | sed 's/cat/"&"/g'
this is a "cat"

[]能够用次符号表示区间 [0-9]     [a-z]等等举办相称

        ${parameter:?message}  
 若parameter为空或未安装,则把message作为职业错误输出 

分组方式替换

用()包起来的,正是1个group。group用\1,\2来表示。

[root@iZ250bl4iyxZ tmp]# cat test.txt 
this is a cute cat.
this is a cute mouse.
[root@iZ250bl4iyxZ tmp]# sed 's/cute \(.*\)/\1/g' test.txt 
this is a cat.
this is a mouse.

陆,特殊字符数组:这个概念好的能够动用

        ${parameter:+word}  
 若parameter设置了,则用word取代parameter举行轮换,parameter值不改变 

[[:alpha:]]   相配任性字母字符,不区分轻重缓急写(都囊括)

7.引用: 

[[:alnum:]]  相称大肆字母数字字符0-玖,A-Z  , a-z

    关闭一个字符的异样意义 

[[:blank:]]   相配空格或许制表符

    \ 

[[:digit:]]     匹配0-9数字

    ” 

[[:lower:]]   相称小写字母

    “” 

[[:print:]]     相配可打字与印刷字符

  1.    if list一    ————————————>list壹退出代码为0时为真 

[[:punct:]]   相配标点符号

        then list2 

[[:space:]]  相称大肆空白:空格,制表符,NL,NF,VT,和CCR-V

    elif list3 

[[:upper:]]   相配任意大写字母

        then list4 

7,星号:

    else 

在合营文本后边表示出现0次或频仍:

        then list5 

ERE包蕴部分特别的恢弘用法,awk工具能辨别可是sed工具不能够

    fi 

1,问号

 

文本前边加上?,表示匹配0次照旧一次

test expression = [expression] expression为test可精通的抒发式 

2,加号

test可精通的表明式: 

非凡文本后增加+,表示至少相配贰回

        -文件测试:检查文件是或不是满意某种特殊规则 

3,化括号

            test option file     option如下图

(m,n)至少出现m此,最多产出n次

 

四,管道符号

vcHRpb24=”
src=”” />

就像是or符号,任性相称就足以

 

5,聚合表明式

        -字符串比较: 

(),用该符号表示,也正是二个准字符

            -z string  长度为0为真 

 

            -n string  长度不为0为真 

 

            string1 = string2 

上面我们来压实验,介绍正则表达式常用的地方及形貌

            string1 != sting2 

1,sed工具

        -数字比较:整数相比 

sed的全程为stream
editor,俗称流编辑器。和故事中的交互式文本编辑器正好相反

            int1 option int2    option————>-eq,  -ne,  -lt,  -le,
 -gt,  -ge 

语法:

                                =     !=     <     <=    >    
>= 

sed options script file

        -复合表明式: 

 -e script  在管理输入时,将script中钦命的指令增多到运转的指令中

            ! 非 

 -f file      在管理输入时,将file中钦赐的一声令下增加到运转的一声令下中

            -a  与st  if [ expression1 -a expression2 ] 

 -n          
不要为各类命令生成输出,等待print命令来输出,起到过滤的意思

            -o  或 

下边11道来:

9. 

e1:

    case word in 

 图片 1

        pattern1) 

笔者们从那五个例证中得以看到,sed
-n选项的过滤效果,可以看来sed的流处理是怎么落到实处的。在那之中s是sed流管理进程中替换的标志,后边还会有众多eg:d删除,p打印等等看看再说

            list1;; 

///一共是八个,前边三个中等是被轮换的公文,后边两当中等是要替换的文件

        pattern2) 

要在sed命令行上试行多条指令,则拉长-e选项就可以了,也便是前方的插入命令,中间加上“;”号,其余不得法的写法看下图

            list2;; 

e2:

        …   www.2cto.com  

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图