\>表示词尾。
如abc\>表示以abc結尾的詞。
.表示任何单个字符。
*表示某个字符出现了0次或多次。
[]字符集合。
如:
[abc]表示匹配a或b或c,还有[a-zA-Z]表示匹配所有的26个字符。
如果其中有^表示反,如[^a]表示非a的字符
正规则表达式是一些很牛的事,比如我们要去掉某html中的tags:
html.txt
1
Thisiswhat
underline;">I
meant.
Understand?
看看我们的sed命令
#如果你这样搞的话,就会有问题
$ sed 's/<.*>//g' html.txt
Understand?
#要解决上面的那个问题,就得像下面这样。
#其中的'[^>]'指定了除了>的字符重复0次或多次。
$ sed 's/<[^>]*>//g' html.txt
ThisiswhatImeant.Understand?
我们再来看看指定需要替换的内容:
$ sed "3s/my/your/g" pets.txt
Thisismy cat
my cat'snameisbetty
Thisisyourdog
mydog'snameisfrank
Thisismyfish
myfish'snameisgeorge
Thisismygoat
mygoat'snameisadam
下面的命令只替换第3到第6行的文本。
$ sed "3,6s/my/your/g" pets.txt
Thisismy cat
my cat'snameisbetty
Thisisyourdog
yourdog'sname
isfrank
Thisisyourfish
yourfish'sname
isgeorge
Thisismygoat
mygoat'snameisadam
$ cat my.txt
Thisismy cat,my cat'sname
isbetty
Thisismydog,mydog'snameisfrank
Thisismyfish,myfish'snameisgeorge
Thisismygoat,mygoat'snameisadam
只替换每一行的第一个s:
$ sed 's/s/S/1' my.txt
ThiSismy cat,my cat'sname
isbetty
ThiSismydog,mydog'snameisfrank
ThiSismyfish,myfish'snameisgeorge
ThiSismygoat,mygoat'snameisadam
只替换每一行的第二个s:
$ sed 's/s/S/2' my.txt
ThisiSmy cat,my cat'sname
isbetty
ThisiSmydog,mydog'snameisfrank
ThisiSmyfish,myfish'snameisgeorge
ThisiSmygoat,mygoat'snameisadam
只替换第一行的第3个以后的s:
$ sed 's/s/S/3g' my.txt
Thisismy cat,my cat'Sname
iSbetty
Thisismydog,mydog'SnameiSfrank
ThisismyfiSh,myfiSh'SnameiSgeorge
Thisismygoat,mygoat'SnameiSadam
多个匹配
如果我们需要一次替换多个模式,可参看下面的示例:
(第一个模式把第一行到第三行的my替换成your,第二个则把第3行以后的This替换成了That)
$ sed '1,3s/my/your/g;
3,$s/This/That/g' my.txt
Thisisyour cat,your cat's
nameisbetty
Thisisyourdog,yourdog'snameis
frank
Thatisyourfish,yourfish'snameis
george
Thatismygoat,mygoat'snameisadam
上面的命令等价于:
(注:
下面使用的是sed的-e命令行参数)
sed -e '1,3s/my/your/g' -e '3,$s/This/That/g' my.txt
我们可以使用&来当做被匹配的变量,然后可以在基本左右加点东西。
如下所示:
$ sed 's/my/[&]/g' my.txt
Thisis[my] cat,[my] cat's
nameisbetty
Thisis[my]dog,[my]dog'snameis
frank
Thisis[my]fish,[my]fish'snameis
george
Thisis[my]goat,[my]goat'snameis
adam
圆括号匹配
使用圆括号匹配的示例:
(圆括号括起来的正则表达式所匹配的字符串会可以当成变量来使用,sed中使用的是\1,\2…)
$ sed 's/Thisismy
\([^,]*\),.*is\(.*\)/\1:
\2/g' my.txt
cat:
betty
dog:
frank
fish:
george
goat:
adam
上面这个例子中的正则表达式有点复杂,解开如下(去掉转义字符):
正则为:
Thisismy([^,]*),.*is(.*)
匹配为:
Thisismy(cat),……….is(betty)
然后:
\1就是cat,\2就是betty
sed的命令
让我们回到最一开始的例子pets.txt,让我们来看几个命令:
N命令
先来看N命令——把下一行的内容纳入当成缓冲区做匹配。
下面的的示例会把原文本中的偶数行纳入奇数行匹配,而s只匹配并替换一次,所以,就成了下面的结果:
$ sed 'N;s/my/your/' pets.txt
Thisisyour cat
my cat'snameisbetty
Thisisyourdog
mydog'snameisfrank
Thisisyourfish
myfish'snameisgeorge
Thisisyourgoat
mygoat'snameisadam
也就是说,原来的文件成了:
Thisismy cat\n my cat's
nameisbetty
Thisismy