LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1101|回复: 8

如何修改文件中第n个匹配的字符串

[复制链接]
发表于 2008-1-4 14:21:28 | 显示全部楼层 |阅读模式
现有一文件test:
DNS=218.10.10.10
#AAA
DNS=218.10.10.10

domain 1.2.3.4
DNS=218.10.10.10

问题:
如何通过shell命令(grep,sed),把第二个"DNS=218.10.10.10",修改为"DNS=218.10.10.11",即修改后的文件:
DNS=218.10.10.10
#AAA
DNS=218.10.10.11

domain 1.2.3.4
DNS=218.10.10.10
发表于 2008-1-4 14:43:57 | 显示全部楼层
首先获得第二次出现的行号,然后对该行进行替换
  1. #!/bin/sh
  2. line=$(grep -n 'DNS=218.10.10.10' test | sed -n '2s/:.*//p')
  3. sed -i "${line}s/DNS=218.10.10.10/DNS=218.10.10.11/" test
复制代码
回复 支持 反对

使用道具 举报

发表于 2008-1-5 01:26:10 | 显示全部楼层
用perl写一个.
  1. perl -i -pe 'if(/DNS=218\.10\.10\.10/){if((++$a)==2){s/$&/DNS=218.10.10.11/}}' test
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-1-7 09:55:21 | 显示全部楼层
如果在C程序中调用system命令来完成这个功能,具体还要做什么样的修改呢?

是否可以有一个完整的解决方案呢?
回复 支持 反对

使用道具 举报

发表于 2008-1-7 15:14:22 | 显示全部楼层
sed -n '1h;1!H;${g;s/DNS=218.10.10.10/DNS=218.10.10.11/2;p;}'
回复 支持 反对

使用道具 举报

发表于 2008-1-7 20:09:40 | 显示全部楼层
sorry ...
回复 支持 反对

使用道具 举报

发表于 2008-1-7 20:10:49 | 显示全部楼层
To ly5066113:

当我把你的命令替换成:

sed -n 'H;${g;s/DNS=218.10.10.10/DNS=218.10.10.11/2;p;}'

这样时,发现行首会多出一个空行,但不明白为什么.可以解释一下吗?
回复 支持 反对

使用道具 举报

发表于 2008-1-7 20:21:58 | 显示全部楼层
Post by lxmxn;1804138
To ly5066113:

当我把你的命令替换成:

sed -n 'H;${g;s/DNS=218.10.10.10/DNS=218.10.10.11/2;p;}'

这样时,发现行首会多出一个空行,但不明白为什么.可以解释一下吗?


因为sed的初始hold space中是有空行(\n)的。
所以我才用1h,第一行记录的时候用pattern space中内容替换hold space,第二行开始才将pattern space中内容追加到hold space。
回复 支持 反对

使用道具 举报

发表于 2008-1-7 21:01:05 | 显示全部楼层
多谢释疑.thanks a lot
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表