sed全称:steameditorsinglequotes&doublequotes&backquotes单引号中的字符为普通字符,不会有任何特殊含义。包括转义字符。所以双引号内的所有字符都会原样输出,$,\,`这三个字符有特殊的含义。其中,$表示引用变量的值,`表示引用命令。反斜杠用于转义这两个字符以及双引号本身。如果要打印出这些特殊字符,需要使用转换,否则会失败#直接打印,会出错[root@hadoopusr]#echo"`">^C#Backquote将反引号括起来的字符串被识别为命令。它等同于$(),推荐使用,因为反引号很容易与单引号混淆。总结当要匹配的字符串或用于替换的字符串中有单引号时,只能用双引号括起来。双引号匹配或替换时,可以用单引号括起来,也可以用双引号括起来用''转义。在sed命令中,引号的解析是由shell来完成的,sed命令只是Gettheresultbyshellparsed。不同的shell可能会对其进行不同的解析。所以最稳妥的办法就是写在一个文件里,通过sed-f执行,避免使用引号。#错误用法--$s会被解析成双引号下的变量。所以会报错。sed"1,3s/my/your/g;3,$s/This/That/g"my.txt#正确用法--使用单引号,不会做解析sed'1,3s/my/your/G;3,$s/This/That/g'my.txt#正确用法--escape$signsed"1,3s/my/your/g;3,\$s/This/That/g"my.txt匹配仅每行的第一个s:$sed's/s/S/1'my.txt仅替换每行的第二个s:$sed's/s/S/2'my.txt仅替换第3和第一行后面的s:$sed'1s/s/S/3g'my.txt特殊符号和命令1.&&用于表示匹配结果。2.括号使用括号匹配的例子:(括号内的正则表达式匹配的字符串可以作为变量,1、2在sed中使用...)$sed's/Thisismy\([^,&]*\),.*是\(.*\)/\1:\2/g'my.txt3。BRE&EREBasic和ExtendedRegex反斜杠用于字符串中特殊字符的转义。我在使用括号时发现了一点疑问。网上给出的例子都需要用\对括号进行转义,这不就是匹配括号本身吗?但是在实践中发现,不使用转义时,会直接匹配字符,转义后才会体现括号的作用。如以下示例所示:#$echo"()"|sed's/()/a/g'a#$echo"abc"|sed's/\(b\)/\1\1/g'abbcand之前学正则表达式的时候,只有需要自己匹配括号的时候才需要转义。这就是基本正则表达式和扩展正则表达式的区别。在Linux的文本处理命令中,grep和sed都只支持基本的正则表达式,而egrep和awk则支持扩展的正则表达式。但是,grep和sed也可以分别通过-E和-r参数支持扩展正则化。基本的正则元字符如下:1.^2.3。.4.>8。\(\)9。\?10.\+网上很多博客都对?和+作为扩展正则表达式,但是要注意,在基本正则表达式中,有这两个符号,而且只是在转义时使用,在linux中测试表明这两个元字符可以正常使用。也有博客说$echo"ABC"|sed"s/A\+BC/DDD/"DDD$回声"ABC"|sed"s/A\?BC/DDD/"DDDextendedregularExtendedregex只去掉了一些常用的元字符,并增加了少量新的元字符。1.+2。?3。()这样我就明白为什么sed中的括号需要转义了。因为sed使用的是基本的正则表达式,所以如果想直接使用括号而不用反斜杠,那么就加上命令参数-r让sed支持扩展的正则表达式。grep也是一样,可以用egrep或者grep-E
