当前位置:K88软件开发文章中心网站服务器框架UNIX → 文章内容

UNIX 正则表达式和 SED

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-23 14:42:37

由 youj 创建, 最后一次修改 2016-08-12 正则表达式和 SED正则表达式是一个字符串,可以用来描述几个字符序列。UNIX 的这些命令中会用到正则表达式,包括 ed、sed、awk、grep,以及 vi。本教程将教你如何使用正则表达式和 sed。这里 sed 代表的流编辑器是一个面向流的编辑器,是专门为执行脚本创建的。因此你的所有输入都会被送到 STDOUT 并且它不改变输入文件。调用 sed在我们开始之前,让我们以确保你有/etc/passwd文本文件的本地副本。如前所述,可以通过一个 pipe 发送数据而调用s ed,如下所示:$ cat /etc/passwd | sedUsage: sed [OPTION]... {script-other-script} [input-file]... -n, --quiet, --silent suppress automatic printing of pattern space -e script, --expression=script...............................cat 命令转储 /etc/passwd 的内容到 sed 是通过 pipe 进入 sed 的模式空间。sed 使用模式空间的内部工作缓冲区来做它的工作。sed 的一般语法:下面是 sed 的一般语法 /pattern/action在这里,pattern 是一个正则表达式,action 则是在下表中给出的命令。当省 pattern 时,如上面我们已经看到的,action 会执行每一行命令。围绕 pattern 的斜杠字符(/)是不可省略的,因为它们是作为分隔符使用。范围描述p输出该行d删除该行s/模式1/模式2/替代第一次出现的模式1和模式2用 sed 删除所有行再次调用 sed ,但这一次使用 sed 的编辑命令删除一行记录,使用字母 d 表示其: $ cat /etc/passwd | sed 'd' $除了通过 pipe 发送一个文件来调用 sed,你可以指导 sed 从文件中读取数据,示例如下。下面的命令与前面是完全一样的,尝试一下,里面不包括 cat 命令: $ sed -e 'd' /etc/passwd $sed地址sed 也可以理解为所谓的地址。地址可以是文件中的一个位置,也可以是一个特殊的编辑命令适用的范围。当 sed 遇到没有地址的情况时,它会对文件中的每一行执行其操作。下面的命令将一个基本的地址添加到您使用的 sed 命令中:$ cat /etc/passwd | sed '1d' |moredaemon:x:1:1:daemon:/usr/sbin:/bin/shbin:x:2:2:bin:/bin:/bin/shsys:x:3:3:sys:/dev:/bin/shsync:x:4:65534:sync:/bin:/bin/syncgames:x:5:60:games:/usr/games:/bin/shman:x:6:12:man:/var/cache/man:/bin/shmail:x:8:8:mail:/var/mail:/bin/shnews:x:9:9:news:/var/spool/news:/bin/shbackup:x:34:34:backup:/var/backups:/bin/sh$注意,数字 1 添加在删除命令前面。这告诉 sed 在文件的第一行执行编辑命令。在这个例子中,sed将删除/etc/password文件的第一行并打印文件的其他部分。sed 地址范围所以如果你想从文件中删除一行,您可以指定一个地址范围如下:$ cat /etc/passwd | sed '1, 5d' |moregames:x:5:60:games:/usr/games:/bin/shman:x:6:12:man:/var/cache/man:/bin/shmail:x:8:8:mail:/var/mail:/bin/shnews:x:9:9:news:/var/spool/news:/bin/shbackup:x:34:34:backup:/var/backups:/bin/sh$以上命令应用的范围是 1 到 5 行。所以将删除这五行。尝试以下地址范围:范围描述'4,10d'删除第 4 到 10 行'10,4d'只删除第 10 行,因为 sed 不能反方向工作'4,+5d'这将匹配文件中的第 4 行,删除这一行之后,继续删除下一个五行,然后停止其删除操作并输出其他行'2,5!d'这将删除除 2 到 5 行外的所有其他行。'1~3d'删除第一行后,跳过接下来的三行,然后删除第四行。sed 继续这种模式直到文件的末尾。'2~2d'sed 删除第二行,跳过下一行后,删除下面的一行,并重复,直到到达文件的末尾。'4,10p'输出 4 到 10 行之间的内容。'4,d'产生语法错误。',10d'也产生语法错误。注意:在使用 p action 的时候,您应该使用 - n 选项来避免重复输出。检查以下两个命令的 betweek 差异: $ cat /etc/passwd | sed -n '1,3p'上面的命令不加 - n 的情形如下: $ cat /etc/passwd | sed '1,3p'替换命令替换命令,用 s 表示,将取代你指定的任何其他字符串。用一个字符串替代另一个,你需要告诉 sed 你第一个字符串的结束位置和想要替换的字符串的开始位置。传统上是由正斜杠(/)将两个字符串分开的。以下命令将替换第一次出现的 root 和 amrood 字符串。 $ cat /etc/passwd | sed 's/root/amrood/' amrood:x:0:0:root user:/root:/bin/sh daemon:x:1:1:daemon:/usr/sbin:/bin/sh ..........................非常重要的一点是,sed 替代只在一个命令行的某一字符串第一次出现时才能使用。如果字符串 root 在一行里面出现不止一次,只有第一个 root 字符串被替换。sed 去做一个全局替换,需要添加字母 g 到命令末尾,命令如下: $ cat /etc/passwd | sed 's/root/amrood/g' amrood:x:0:0:amrood user:/amrood:/bin/sh daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh ...........................替换标志除了 g 标志外,还有许多其他有用的标志可以使用,而且您每次可以指定多余一个标志。标志描述g替换所有可以匹配的字符而不仅仅是第一个NUMBER仅仅替换第 NUMBLER 个匹配的字符p如果发生了替换,则输出模式空间 w FILENAME如果发生了替换,则将结果写到 FILENAMEI or i以不区分大小写的方式匹配M or m除了拥有特殊正则表达式字符`^`和`$`的正常的行为外,这个标志使`^`匹配换行符后的空字符串,使$匹配换行符前的空字符串。使用一个可替换的字符串分隔符你会发现自己不得不对包含斜杠字符的字符串做一个替换。在这种情况下,您可以对 s 后的字符来指定一个不同的分隔符。 $ cat /etc/passwd | sed 's:/root:/amrood:g' amrood:x:0:0:amrood user:/amrood:/bin/sh daemon:x:1:1:daemon:/usr/sbin:/bin/sh在上面的例子中:/ 作为定界符使用,而不是斜线/。因为我们试图搜索 /root,而不是简单的 root 字符串。使用空串的执行替换使用一个空的替换字符串去删除/etc/passwd文件的 root 字符串。 $ cat /etc/passwd | sed 's/root//g' :x:0:0::/:/bin/sh daemon:x:1:1:daemon:/usr/sbin:/bin/sh地址替换如果你想只在第 10 行用字符串 sh 替换字符串 quiet,你可以指定如下: $ cat /etc/passwd | sed '10s/sh/quiet/g' ro

[1] [2] [3]  下一页


UNIX 正则表达式和 SED