sed是stream editor缩写,表示流编辑器,它是一款文本处理工具,可以配合正则表达式进行文本替换。
1、使用正则表达式匹配并进行文本中的字符串替换
*使用-i选项可以直接将替换结果应用到源文件而不用重定向到其他新文本。
*sed 's/pattern/replace_string/' file.txt会将文本中第一次出现的pattern替换为replace_string。若要对全文本应用次替换,需要在命令尾部加上g参数,即sed 's/pattern/replace_string/g' file.txt,若要从第N次开始替换,可以使用Ng即为,即sed 's/pattern/replace_string/Ng' file.txt。如:
[root@RHEL-6 ~]# echo "patternpatternpatternpattern" | sed 's/pattern/PATTERN/4g' patternpatternpatternPATTERN [root@RHEL-6 ~]# echo "patternpatternpatternpattern" | sed 's/pattern/PATTERN/3g' patternpatternPATTERNPATTERN [root@RHEL-6 ~]# echo "patternpatternpatternpattern" | sed 's/pattern/PATTERN/2g' patternPATTERNPATTERNPATTERN [root@RHEL-6 ~]# echo "patternpatternpatternpattern" | sed 's/pattern/PATTERN/g' PATTERNPATTERNPATTERNPATTERN
*字符/在sed中作为定界符使用,但是我们可以使用任意的定界符(如果所使用的定界符出现在所要匹配的样式内部,则需要用\进行转义),如下:
[root@RHEL-6 ~]# echo "patternpatternpatternpattern" | sed 's#pattern#PATTERN#g' PATTERNPATTERNPATTERNPATTERN [root@RHEL-6 ~]# echo "patternpatternpatternpattern" | sed 's*pattern*PATTERN*g' PATTERNPATTERNPATTERNPATTERN [root@RHEL-6 ~]# echo "patternpatternpatternpattern" | sed 's^pattern^PATTERN^g' PATTERNPATTERNPATTERNPATTERN
2、常用技巧:
#移除空白行:sed '/^$/d' file.txt (/pattern/d会移除匹配样式的行,在空白行中,行尾标记紧随着行首标记)
[root@CentOS-6 testdir]# cat test max maxtrix 010-12345678 IPADDR: 192.168.0.1 0.0.0.0 [root@CentOS-6 testdir]# sed '/^$/d' test max maxtrix 010-12345678 IPADDR: 192.168.0.1 0.0.0.0 [root@CentOS-6 testdir]#
#已匹配字符串标记&:在sed中,用&标记被匹配的字符串,可在替换字符串时使用:
[root@CentOS-6 testdir]# echo "this is test" | sed 's/\w\+/[&]/g' [this] [is] [test]
#子串匹配标记\1、\2等:&代表匹配给定样式的字符串,但是sed可以匹配给定样式的其中一部分,如:
[root@CentOS-6 testdir]# echo "hao ni" | sed 's/\([a-z]\+\) \([a-z]\+\)/\2 \1/' ni hao [root@CentOS-6 testdir]# echo "I am number 7" | sed 's/number \([0-9]\)/\1/' I am 7
第一个例子中,使用相同的样式分别匹配了hao(子串1,表示为\1)和ni(子串2,表示为\2),在替换的时候两个匹配的子串调换位置,所以结果为“ni hao”,第二个例子中。number [0-9]匹配了number 7,其中7为匹配字符串,是第一个子串,替换中为\1即将number 7替换为第一个子串7
#组合多个表达式:多个替换可以用管道符来处理,也可以在同一个sed命令中用“;”分隔,如下:
[root@CentOS-6 testdir]# echo "nice too meet you" | sed 's/n/N/' | sed 's/too/to/' Nice to meet you [root@CentOS-6 testdir]# echo "nice too meet you" | sed 's/n/N/;s/too/to/' Nice to meet you
#引用:sed表达式通常用单引号来引用,不过也可以使用双引号。双引号会通过对表达式求值来进行扩展。当我们想在表达式中使用一些变量字符串时,双引号就有用武之地了:
[root@CentOS-6 testdir]# ojb=LYNUX [root@CentOS-6 testdir]# echo "hello lynux" | sed "s/lynux/$obj/" hello LYNUX