上个博文记录了正则表达式的基本代换规则,
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.txt
Fruit Price/lbs
Banan 0.89
Paech 0.79
Kiwi 1.50
Pineapple 1.29
Apple 0.99
Mango 2.20
sed '/ 0\.[0-9][0-9]$/p' fruit_prices.txt
这个正则表达式的含义是待定模式应该是0开头,接下来是一个点,再下来是两位数字,再下来是$这意味着这个字符串应该位于结尾,然后是动作p打印。
使用这个例子如果在机器上验证呢?
首先使用vi fruit_prices.txt建立一个文件,并且输入水果价格。
然后再在命令行中输入上面的命令。
然而你看到的应该是这样的内容:
Fruit Price/lbs
Banan 0.89
Banan 0.89
Paech 0.79
Paech 0.79
Kiwi 1.50
Pineapple 1.29
Apple 0.99
Apple 0.99
Mango 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