Chinaunix

标题: 求教 文本处理 在特定字段后添加 字段 [打印本页]

作者: shintoky    时间: 2014-04-01 10:35
标题: 求教 文本处理 在特定字段后添加 字段
如下6行文本,如何插入特定字段"specail{test}"
要求在 以包含key-word 为关键字的 ,之后第一个以add 为开始; 在add {} 的结尾位置 插入特定字段

remote dc-123 { file("/aa/key-word/aa" owner("a") group("b") perm (0640)); };
filter f_dc-123 { host("dc-123") and not match("xyz" value(MSG)); };
add { source(net); filter(f_dc-123); remote(dc-123); }; special {test}
remote dc-124 { file("/aa/non-keyword/aa" owner("a") group("b") perm (0640)); };
filter f_dc-124 { host("dc-124") and not match("xyz" value(MSG)); };
add { source(net); filter(f_dc-124); remote(dc-124); };
作者: yestreenstars    时间: 2014-04-01 10:48
  1. sed '/key-word/,/^add/{/^add/s/$/special {test}/}'
复制代码
  1. sed '/key-word/{:1;n;/^add/!b1;s/$/special {test}/}'
复制代码

作者: shintoky    时间: 2014-04-01 10:54
回复 2# yestreenstars


   我了个去 大神你是星星来的吧
作者: shintoky    时间: 2014-04-01 11:04
回复 2# yestreenstars


    俄 不好意思 我前面写的有点问题, 应该在括号里面
add { source(net); filter(f_dc-123); remote(dc-123); special {test};};
作者: yestreenstars    时间: 2014-04-01 11:18
本帖最后由 yestreenstars 于 2014-04-01 23:28 编辑

回复 4# shintoky

自己手动改一下就好啦:
  1. sed '/key-word/,/^add/{/^add/s/}/special {test}; &/}'
复制代码
  1. sed '/key-word/{:1;n;/^add/!b1;s/}/special {test}; &/}'
复制代码

作者: jason680    时间: 2014-04-01 12:10
回复 4# shintoky

$ awk '/key-word/{P=1}P==1&&/^add /{$NF="special {test}; "$NF;P=0;}1' FILE
remote dc-123 { file("/aa/key-word/aa" owner("a") group("b") perm (0640)); };
filter f_dc-123 { host("dc-123") and not match("xyz" value(MSG)); };
add { source(net); filter(f_dc-123); remote(dc-123); special {test}; };
remote dc-124 { file("/aa/non-keyword/aa" owner("a") group("b") perm (0640)); };
filter f_dc-124 { host("dc-124") and not match("xyz" value(MSG)); };
add { source(net); filter(f_dc-124); remote(dc-124); };

   
作者: shintoky    时间: 2014-04-01 12:11
回复 5# yestreenstars
谢谢啦!



   
作者: shintoky    时间: 2014-04-01 12:37
回复 6# jason680
appreciate as well !

   
作者: Herowinter    时间: 2014-04-01 22:20
@yestreenstars@jason680
拜读完代码,两位大神的深藏功与名不禁使我激动的心情
久久不能平复。那高大上的代码,简单高效的回复,深入
浅出的讲解,使我等写无可写。
作者: shintoky    时间: 2014-04-02 09:52
回复 9# Herowinter


   
作者: shintoky    时间: 2014-04-02 17:11
回复 5# yestreenstars
大神,我今天抽空研究了一下,发现使用下面的也可以达到目的
sed '/key-word/,/^add/s/}/special {test}; &/' file

那么为什么要多加一个add ? 有什么特殊意义?
sed '/key-word/,/^add/{/^add/s/}/special {test}; &/}'

   
作者: yestreenstars    时间: 2014-04-02 17:15
回复 11# shintoky

[root@localhost ~]# sed '/key-word/,/^add/{/^add/s/}/special {test}; &/}' i
remote dc-123 { file("/aa/key-word/aa" owner("a") group("b") perm (0640)); };
filter f_dc-123 { host("dc-123") and not match("xyz" value(MSG)); };
add { source(net); filter(f_dc-123); remote(dc-123); special {test}; };
remote dc-124 { file("/aa/non-keyword/aa" owner("a") group("b") perm (0640)); };
filter f_dc-124 { host("dc-124") and not match("xyz" value(MSG)); };
add { source(net); filter(f_dc-124); remote(dc-124); };

[root@localhost ~]# sed '/key-word/,/^add/s/}/special {test}; &/' i
remote dc-123 { file("/aa/key-word/aa" owner("a") group("b") perm (0640)); special {test}; };
filter f_dc-123 { host("dc-123") and not match("xyz" value(MSG)); special {test}; };
add { source(net); filter(f_dc-123); remote(dc-123); special {test}; };
remote dc-124 { file("/aa/non-keyword/aa" owner("a") group("b") perm (0640)); };
filter f_dc-124 { host("dc-124") and not match("xyz" value(MSG)); };
add { source(net); filter(f_dc-124); remote(dc-124); };   
作者: shintoky    时间: 2014-04-03 15:18
回复 12# yestreenstars
哦哦 对哦 还是想不明白为什么要 多加一个^add ? 不是已经定义 从  add 开始修改么?

   
作者: yestreenstars    时间: 2014-04-03 15:50
回复 13# shintoky

/key-word/,/^add/相当于匹配1-3行,如果不在s/}/special {test}; &/操作前加上/^add/的话,它会把1-3的都替换掉,但是如果加上之后,就只会对匹配到/^add/的行,也就是第3行进行替换。
   
作者: shintoky    时间: 2014-04-04 09:12
回复 14# yestreenstars


    恩恩 现在明白了 多谢赐教




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