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

UNIX 正则表达式和 SED

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

ot:x:0:0:root user:/root:/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 sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh mail:x:8:8:mail:/var/mail:/bin/sh news:x:9:9:news:/var/spool/news:/bin/sh backup:x:34:34:backup:/var/backups:/bin/quiet同样的,做一个地址范围替换,你可以做如下操作: $ cat /etc/passwd | sed '1,5s/sh/quiet/g' root:x:0:0:root user:/root:/bin/quiet daemon:x:1:1:daemon:/usr/sbin:/bin/quiet bin:x:2:2:bin:/bin:/bin/quiet sys:x:3:3:sys:/dev:/bin/quiet sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh mail:x:8:8:mail:/var/mail:/bin/sh news:x:9:9:news:/var/spool/news:/bin/sh backup:x:34:34:backup:/var/backups:/bin/sh正如你从输出所看到的,前五行里面的字符串 sh 都改为了 quiet,但是其他行里面的 sh 都丝毫没有改变。匹配命令你可以使用 p 参数和 - n 参数输出所有匹配的行,如下所示: $ cat testing | sed -n '/root/p' root:x:0:0:root user:/root:/bin/sh [root@ip-72-167-112-17 amrood]# vi testing root:x:0:0:root user:/root:/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 sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh mail:x:8:8:mail:/var/mail:/bin/sh news:x:9:9:news:/var/spool/news:/bin/sh backup:x:34:34:backup:/var/backups:/bin/sh使用正则表达式在进行模式匹配时,您可以使用正则表达式,它提供了更多的灵活性。检查下面的例子中以 daemon 开始的行然后删除: $ cat testing | sed '/^daemon/d' root:x:0:0:root user:/root:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh mail:x:8:8:mail:/var/mail:/bin/sh news:x:9:9:news:/var/spool/news:/bin/sh backup:x:34:34:backup:/var/backups:/bin/sh下面是将删除以 sh 结尾的所有行的例子: $ cat testing | sed '/sh$/d' sync:x:4:65534:sync:/bin:/bin/sync下表列出了四个在正则表达式里面非常有用的特殊字符。字符描述^匹配一行的起始$匹配一行的结尾.匹配任何的单个字符*匹配零个或多个以前出现的字符[chars]为了匹配任何字符串的字符。您可以使用`-`字符来表示字符的范围。匹配字符来看看在其他的表达式里面如何演示元字符的使用。例如下面的模式:表达式描述/a.c/匹配包含字符串如a+c,a-c,abc, match, 还有 a3c/a*c/匹配相同的字符串还有字符串比如ace,yacc,以及arctic/[tT]he/匹配字符The和the/^$/匹配空白行/^.*$/不管任何情况,都匹配一整行/ */匹配一个或多个空格/^$/匹配空行下表给出了一些常用的字符:集描述[a-z]匹配一个小写字母[A-Z]匹配一个大写字母[a-zA-Z]匹配一个字母[0-9]匹配数字[a-zA-Z0-9]匹配单个字母或数字字符类关键词通常来说,一些特殊的关键字对 regexp 来说也是适用的,尤其是 GNU 实用程序会使用 regexp。对 sed 正则表达式来说这些都是非常有用的,因为这样既简化了表达式又增强了可读性。例如,字符 a 到 z 以及字符 A 到 Z 构成了这样一个用关键字[[:alpha:]]表示的类。使用字母表的字符类关键词,这个命令输出/etc/syslog.conf文件里面以字母表的字母开始的行: $ cat /etc/syslog.conf | sed -n '/^[[:alpha:]]/p' authpriv.* /var/log/secure mail.* -/var/log/maillog cron.* /var/log/cron uucp,news.crit /var/log/spooler local7.* /var/log/boot.log下表是 GNU sed 的可用的字符类关键词的一个完整的列表。字符类描述[[:alnum:]]字母(a - z A-Z 0 - 9)[[:alpha:]]字母(a - z A-Z)[[:blank:]]空白字符(空格或制表键)[[:cntrl:]]控制字符[[:digit:]]数字[0 - 9][[:graph:]]任何可见字符(不包括空格)[[:lower:]]小写字母的[a -?][[:print:]]可打印字符(无控字符)[[:punct:]]标点字符[[:space:]]空白[[:upper:]]大写字母的[A -Z][[:xdigit:]]十六进制数字[0 - 9 a - f A-F]&引用sed 元字符 & 代表被匹配的 pattern 的内容。例如,假设您有一个名为 phone.txt 的文件,里面都电话号码,如下所示: 5555551212 5555551213 5555551214 6665551215 6665551216 7775551217你想让前三个数字被括号括起来以更容易阅读。要做到这一点,您可以使用 & 替换字符,如下所示: $ sed - e ' s / ^[[数位:]][[数位:]][[数位:]](&)/ g phone.txt (555)5551212 (555)5551213 (555)5551214 (666)5551215 (666)5551216 (777)5551217先匹配 3 位数字,然后使用 & 取代那些括号括起来的数字。使用多个 sed 命令您可以在一个 sed 命令下使用多个 sed 命令,如下: $ sed -e 'command1' -e 'command2' ... -e 'commandN' files这里 commandN 到 command1 都是我们之前讨论的 sed 类型命令。这些命令应用于每个文件列表的行。以相同的机制,我们可以以下面的方式写上面的电话号码: $ sed - e ' s / ^[[数位:]]\ \ { 3 } /(&)/ g \ - e ' s /)[[数位:]]\ \ { 3 } / & - / g phone.txt (555)555 - 1212 (555)555 - 1213 (555)555 - 1214 (666)555 - 1215 (666)555 - 1216 (777)555 - 1217注意:在上面的例子中,不是重复字符类关键字[[:digit:]] 三次,而是代之以\{3\},这意味着前三次正则表达式相匹配。引用& 元字符是有用的,但更有用的功能是能够在正则表达式中定义特定区域,通过定义正则表达式的特定的一部分,您可以引用字符引用这部分。反向引用时,你必须首先定义一个区域,然后回顾这个区域。定义一个区域是在

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


UNIX 正则表达式和 SED