众所周知,sed命令(更精确的说,它是一个函数)有很强大的作用。这里结合自己的工程,讲一个简单的应用。
假定这里有一个文本,记载了本地可以允许访问的IP。
文本名为ip.conf,记载内容为ip="",如果允许1.1.1.1访问,则应该是ip="1.1.1.1 "(以此类推)
下面演示一个利用sed命令来改变它,假如要假如1.2.3.4这个IP,则需要输入:
sed -i "/^ip/s/\"$/ 1.2.3.4\"/g" ip.conf
输入以上命令后,现在文本内容应该变成ip="1.1.1.1 1.2.3.4"
假如要删除1.2.3.4,则应该输入:
sed -i "/^ip/s/ 1.2.3.4\"//g" ip.conf
输入这个命令后,文本内容应该变成了ip="1.1.1.1"
下面介绍下sed的一种常用方式(这里只讨论sed用于更改文本内容的用法),以及上述做法的思路。
:
-i 参数表示处于文本编辑模式
/^ip/表示一个正则表达式,表示寻找以ip开头的文本行
接下来的s表示这是一个替换的操作,其格式为:
s/patten-to-find/pattern-to-replace/[g p w n]
其中pattern-to-find用于寻找要匹配的地方 而pattern-to-replace表示要替换的样子
结尾的g表示全局匹配 p
缺省sed将所有被替换行写入标准输出,加p选项将使-n选项无效。-n选项不打印输出结果。
w 文件名 使用此选项模式将输出重定向到一个文件
接下来讲下我的思路 在插入一个IP的时候,寻找ip开头的文本行的最末尾的"(双引号),然后将"替换成**.**.**.** "
在删除一个IP的时候,将**.**.**.** "替换成"
这里还可以做进一步的改进,引入&命令(它保存了被寻找要改的模式),例如添加IP的地方可以这样做:
sed -i "/^ip/s/\"$/ 1.2.3.4 &/g" ip.conf
我这个思路肯定不是最完美的,希望大家提出更好的建议。