正则表达式基础字符匹配2

来源:互联网 发布:如何参加爱淘宝 编辑:程序博客网 时间:2024/05/20 08:25

上个博文记录了正则表达式的基本代换规则,


http://blog.csdn.net/crazyss/article/details/7057546


这次先通过几个问题回忆一下:


1如何代换空行:

/^$/
在脚本中,^代表行首,$代表行尾。这个行首不是行的第一个字母而是第一个字母前面的空位,这一点非常重要。

2如何在行首加入指定字符:

  例如:在行首加入'#',这个符号是注释的意思。

s/^/#/

前面的s先不去看它,后面的^,#代表行首和加入到行首的字符。前面的s是什么意思这篇博文再看。


在Linux系统中,有两个工具可以处理正则表达式。sed 和 awk。我们先看sed。

sed从本质上来讲是一个文本流处理器。而文本流是一种叫做文件的东西。这个定义我相信大家应该没有什么可以质疑的,新手总是不知道“流”是什么东西。在这里“流”就是字符序列。而文件的定义就是字符序列。

再来看sed的基本用法

sed 'script' files

files 是一个或多个文件的列表,script是如下形式的一个或多个命令:

/pattern/ action

他的具体格式应该如下:

sed '/pattern/ action' files

pattern 是过文化正则表达式,action是下列命令之一。如果pattern被省略,输入的每一行都被操作。

action描述p打印d删除s用一个表达式置换另一个表达式

我们用一个小的关于水果的报价单来看看如何使用sed来过滤


cat fruit_prices.txtFruit         Price/lbsBanan         0.89Paech         0.79Kiwi          1.50Pineapple     1.29Apple         0.99Mango         2.20


我们先来输出价格小于$1的水果价格

sed '/ 0\.[0-9][0-9]$/p' fruit_prices.txt
这个正则表达式的含义是待定模式应该是0开头,接下来是一个点,再下来是两位数字,再下来是$这意味着这个字符串应该位于结尾,然后是动作p打印。

使用这个例子如果在机器上验证呢?

首先使用vi fruit_prices.txt建立一个文件,并且输入水果价格。

然后再在命令行中输入上面的命令。

然而你看到的应该是这样的内容:

Fruit         Price/lbsBanan         0.89Banan         0.89Paech         0.79Paech         0.79Kiwi          1.50Pineapple     1.29Apple         0.99Apple         0.99Mango         2.20
我们想要得到1美元以下的水果,为什么出现这么多呢?仔细观察好像有好多记录都是重复的这是因为sed默认情况下会输出每一行,再输出你选定的行,这意味着你可能会看到两次你要的行。

修改一下命令:

sed -n ' 0\.[0-9][0-9]$/p' fruit_prices.txt

这模式前面加上一个-n选项,sed就不会输出"非选中行"了。


还可以删除指定的行

/pattern/d

sed '/^[Mn]ango/d' fruit_prices.txt

需要注意,sed命令并不会改变文件的真实内容,它只会将修改输出,如果你想真的修改文件需要使用重定向。


还可以替换指定单词

/pattern1/s/pattern2/pattern3/
使用如下格式替换

sed 's/eqal/equal/g' nsh.txt
可以替换eqal为equal,在整个文件中。

还有有一个功能

sed 's/ *[0-9[0-9]*\.[0-9][0-9]$/\$&/' fruit_prices.txt
其中第而二个$后面的&是代替前面所匹配到的字符的。这个功能就是把所有价格前面加上一个$符号。

可以一次性执行多个命令

sed -e 's/Paech/Peach/' -e 's/ *[0-9][0-9]*\.[0-9][0-9]$/\$&/' fruit_prices.txt
它的格式是:

sed -e 'cmd1'   ... -e 'cmdN' files




原创粉丝点击