3.2.7.1 替换细节

    先前已经提过,除斜杠还可以使用其他任意字符作为定界符;在正则表达式或替代文本里,也能转义定界符,不过这么做可能会让命令变得很难看懂:
        sed 's//home/tolstoy///home/.lt//'
 
    在前面的3.2.2节里,我们已经讲到 POSIX 的 BRE 时,已说明后向引用在正则表达式里的用法。sed 了解后向引用,而且它们还能用于替代文本中,以表示“从这里开始替换成匹配第 n 个圆括号里子表达式的文本”
 
    [many@avention Desktop]$ echo /home/tolstoy/ | sed 's;(/home)/tolstoy/;1/lt/;'
    /home/lt/
 
    sed 将 1 替代为匹配于正则表达式的 /home 部分。在这里的例子中,所有的字符都表示它自己,不过任何正则表达式都可括在 ( 与 ) 之间,且后向引用最多可以用到9个。
    
    [many@avention Desktop]$ echo woainieveryone | sed 's;every(one);any1;'
    woainianyone
 
     有些其他字符在替代文本里也有特殊含义。我们已经提过需要使用反斜杠转义定界符的情况。当然,反斜杠字符本身也可能需要转义。最后要说明的是:&在替换文本里表示的意思是“从此点开始替代与匹配于正则表达式的整个文本”。举例来说,假设处理 Atlanta Chamber of Commerce 这串文本,想要在广告册中修改所有对该城市的描述:
 
    [many@avention Desktop]$ echo Atlanta Chamber of Commerce | sed 's;Atlanta;&,the capital of the South;'   就在Atlanta后面插入the capital of the South
    Atlanta,the capital of the South Chamber of Commerce
 
    如果要在替代文本里使用&字符的字面意义,请使用反斜杠转义它。例如,下面的小脚本便可以转换 DocBook/XML 文件里字面上的反斜杠,将其转换为 DocBook 里对应的 &bol:
 
    [many@avention Desktop]$ echo woainieveryoneabonecdoneefone | sed 's/one/$no/g'
    woainievery$noab$nocd$noef$no
 
    在 s 命令里以 g 结尾表示的是:全局性(global),意即以“替代文本取代正则表达式中每一个匹配的”。如果没有设置 g,sed 只会取代第一个匹配的。这里来比较看看有没有设置 g 所产生的结果:
 
    [many@avention Desktop]$ echo Tolstoy reads well. Tolstoy writes well. | sed 's/Tolstoy/Camus/'
    Camus reads well. Tolstoy writes well.
 
    [many@avention Desktop]$ echo Tolstoy reads well. Tolstoy writes well. | sed 's/Tolstoy/Camus/g'
    Camus reads well. Camus writes well.
 
    鲜为人知的是:你可以在结尾指定数字,指示第 n 个匹配出现才要被取代:
    [many@avention Desktop]$ echo Tolstoy reads well. Tolstoy writes well. | sed 's/Tolstoy/Camus/2'                  仅替代第二个匹配者 
    Tolstoy reads well. Camus writes well.
 
    到目前为止,我们讲得都是一次替换一个。虽然可以将多个 sed 实体以管道(pipeline)串起来,但是给予 sed 多个命令是比较容易的。在命令行上,这是通过 -e 选项的方式来完成的。每一个编辑命令有使用一个 -e 选项:
 
    sed -e 's/foo/bar/g' -e 's/chicken/cow/g' myfile.xml > myfile2.xml
 
    不过,如果你有很多要编辑的项目,这种形式就很恐怖了。所以有时,将编辑命令全放进一个脚本里,在使用 sed 搭配 -f 选项会更好:
        cat fixup.sed
        s/foo/bar/g
        s/chicken/cow/g
        s/draft animal/horse/g
        ...
 
        sed -f fixup.sed myfile.xml > myfile2.xml
 
    arr4_string=`echo $arr1_string | sed  -e "s/ $new_mouth//" -e "s/ /:/g"`   如果需要在 sed 中引用变量,则需要使用双引号。
原文地址:https://www.cnblogs.com/avention/p/10307151.html