• 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 中引用变量,则需要使用双引号。
  • 相关阅读:
    关于IP4上WIFI设置静态IP的一点经验
    迷你MVVM框架 avalonjs 1.1发布
    r.js合并实践
    IE6的checkbox, radio是通过defaultChecked决定是否选中
    2013年最后的收成:avalon1.0正式发布
    还要多少年, 前端开发才能像后端那样轻松
    JavaScript Promise:去而复返
    JavaScript 18岁生日快乐
    web界面上的字体兼容方案
    键盘钩子原理----开发按键发音程序
  • 原文地址:https://www.cnblogs.com/avention/p/10307151.html
Copyright © 2020-2023  润新知