sed中正则表达式的使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wwlhz/article/details/82584947

sed是linux下文本处理的一个非常重要的工具,可用于批量文本的查找和替换,也可以采用正则表达式格式。

  1. 正常用法

    sed ‘s/pattern/replace_string/’ file

    这个命令并不会直接替换file文件中的内容,只是会输出替换后的内容。如果要实时替换生效,需要加上 -i 选项(in place的意思),即:
    sed -i ‘s/pattern/replace_string/’ file

  2. 高级用法
    采用正则表达式
    比如有一个文本init.xml中相关的配置选项:

    <root>
    <process>
    <!--
        进程信息:
            nickname:每个进程唯一对应的别名,用于区分各个进程;
    -->
        <!--1110 从编号0开始, [2-5]4个cpu --> 
        <!--1110 从编号0开始的[2,15] 14个cpu  24G--> 
        <item daemon="true"  nickname="p1" cpumask="E" TimeLimit="0" MemLimit="1048576">
            <ProName>program.exe</ProName>
            <Parameter></Parameter>
            <ProPath>/mnt/hgfs/version_1/bin/linux64/program.exe</ProPath>
            <szRunCmd><![CDATA[cd /mnt/hgfs/version_1/bin/linux64/&&./program.exe>/dev/null&]]></szRunCmd>
        </item> 
    </process> 
    <rule>
        <item relation="p1" restart="p1"></item>
    </rule>
    </root>

    需要把其中的的值替换为新的路径path,把的值替换为相应的路径值。

    sed -i “s?.+? p r o g p a t h prog_exe?” config/Daemon.xml
    其中:
    .+ 表示任意字符
    类似的还有:\w+ 匹配包括下划线的任何单词字符
    ? 是分隔符,一般用/, 但如果正则中包含/, 则再用/作为分隔符,就需要转义,而且阅读不太直观;

    sed中用()括号括起来的正则匹配的子内容,可以用到替换字符串中,用\1,\2…来表示,
    还可以用$来表示整个匹配的内容。

  3. 骨灰用法

如果要替换的内容,用共同的地方,则可以一次性替换所有的文件,避免逐个文件处理。
例如:

sed -i "s?$original_file_path?$file_path?" `grep $original_file_path -rl config/`

config 目录下查找所有 o r i g i n a l f i l e p a t h file_path。

猜你喜欢

转载自blog.csdn.net/wwlhz/article/details/82584947
今日推荐