Chinaunix

标题: 一道sed难题,大家进来看下 [打印本页]

作者: lionfun    时间: 2011-10-30 21:47
标题: 一道sed难题,大家进来看下
本帖最后由 lionfun 于 2011-10-31 00:08 编辑

一个配置文件的一部分内容如下:
%% 地图配置
{
        map,
        [
                {"192.168.0.93", 2},
                {"192.168.0.96", 4}
                %%{"192.168.0.97", 10}
                %%{"192.168.0.207", 0},
                %%{"192.168.0.208", 1}
        ]
}.

现在想修改成:
%% 地图配置
{
        map,
        [
                {"192.168.0.110", 2}
                %%{"192.168.0.97", 10}
                %%{"192.168.0.207", 0},
                %%{"192.168.0.208", 1}
        ]
}.

如何用sed 直接在源文件上修改?

问题补充:
map,
        [
                {"192.168.0.93", 2},
                {"192.168.0.96", 4}
                %%{"192.168.0.97", 10}
                %%{"192.168.0.207", 0},
                %%{"192.168.0.208", 1}
        ]
中的这些IP和后面的那个数字是不固定的,以%%开头的行是注释,可以手动去掉,不用理他,也即是说把类似
{"192.168.0.93", 2},
{"192.168.0.96", 4}
这样的多行,替换成我指定一行,例如改成:
{"192.168.1.100", 5}

作者: ziyunfei    时间: 2011-10-30 21:56
标题党
作者: lionfun    时间: 2011-10-30 22:04
回复 2# ziyunfei


   
作者: Shell_HAT    时间: 2011-10-30 22:10
  1. sed -i '/{"192.168.0.93", 2}/d; s/192\.168\.0\.96", 4/192.168.0.110", 2/' urfile
复制代码

作者: yuloveban    时间: 2011-10-30 22:32
sed '/192.168.0.96/d;s/192.168.0.93/192.168.0.110/' filename
作者: lionfun    时间: 2011-10-30 23:28
本帖最后由 lionfun 于 2011-10-30 23:30 编辑

回复 4# Shell_HAT

我没说清楚
   
%% 地图配置
{
        map,
        [
                {"192.168.0.93", 2},
                {"192.168.0.96", 4}
                %%{"192.168.0.97", 10}
                %%{"192.168.0.207", 0},
                %%{"192.168.0.208", 1}
        ]
}.

这个里面可能有很多行的,如下:
%% 地图配置
{
        map,
        [
                {"192.168.0.93", 0},
                {"192.168.0.96", 2},
                {"192.168.0.97", 7}
                %%{"192.168.0.207", 0},
                %%{"192.168.0.208", 1}
        ]
}.

或者是
%% 地图配置
{
        map,
        [
                {"192.168.0.93", 0},
                {"192.168.0.96", 2},
                {"192.168.0.97", 7},
                {"192.168.0.207",20}
                %%{"192.168.0.208", 1}
        ]
}.


%% 带有这个的是注释行,不用管他,不管有多少类似
     {"192.168.0.93", 0},
                {"192.168.0.96", 2},
                {"192.168.0.97", 7},
                {"192.168.0.207",20}
这样的行,都替换成一行就可以,谢谢!
作者: yinyuemi    时间: 2011-10-31 07:55
回复 6# lionfun

    试试这个?
  1. sed -e '/{.*".*}/,/%%{/{/%%/! d' -e '/%%{/{s/\(\s\+\)\S\+/\1{"xxx.xxx.xxx.xxx",y}\n&/' -e ':a;N;ba}' -e' }'  -i cfg.file
复制代码

作者: ly5066113    时间: 2011-10-31 09:39
sed '/[[:space:]]{"/d;/\[/a\
{"192.168.0.110", 2}
' urfile
作者: jason680    时间: 2011-10-31 10:22
本帖最后由 jason680 于 2011-10-31 10:23 编辑

回复 1# lionfun


# echo '%% 地图配置
{
        map,
        [
                {"192.168.0.93", 0},
                {"192.168.0.96", 2},
                {"192.168.0.97", 7},
                {"192.168.0.207",20}
                %%{"192.168.0.208", 1}
        ]
}.' | awk 'T==0{print}/\]/{print;T=0}/\[/{T=1;print"\t\t{\"192.168.0.xx\", 0}"}'
%% 地图配置
{
        map,
        [
                {"192.168.0.xx", 0}
        ]
}.
作者: lionfun    时间: 2011-10-31 14:24
回复 8# ly5066113

这个可以,我修改了下,成功了!谢谢Tim大师
  1.     sed -i '/map,/,/}\./ {/[[:space:]]{"/d;/\]/i \
  2. \t\t{"'$l_tel_ip_A'", 2}
  3. }' $erl_config_path
复制代码

作者: lionfun    时间: 2011-10-31 14:28
回复 7# yinyuemi


    谢谢,你的sed需要琢磨,比较难!




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2