sed - 在文件中查找路径并替换该行的原位模式

时间:2015-03-05 11:02:45

标签: regex bash file sed grep

我必须删除15个文件(服务器)中的root权限条目,并在单独的文件中提供NFS共享并控制此过程 - 我想通过服务器进行一些额外的检查。我有2个文件,首先称为nfspaths,如下例所示:

cat ./nfspaths:
/mnt/vol/virtserver1/sharename
/mnt/vol/virtserver2/sharename
/mnt/vol/virtserver4/sharename

和exportfs看起来像这样:

cat ./exportfs:
/mnt/vol/virtserver1/sharename rw=host1,host2,host3,root=host1,host2,host3,host4,host5
/mnt/vol/virtserver2/sharename rw=host1,host2,host3,root=host1,host2,host3,host4,host5
/mnt/vol/virtserver3/sharename rw=host1,host2,host3
/mnt/vol/virtserver4/sharename rw=host1,host2,host3,root=host1,host2,host3,host4,host5
/mnt/vol/virtserver5/sharename rw=host1,host2,host3

我想创建一个在nfspath中查找nfspath的脚本,并且该行将删除root权限。我试图用sed做这份工作,我写了这样的话:

for nfspath in `cat nfspaths.list`
do
   sed -i -n -e "\,$nfspath,p" -e 's/,root=.*$//g' exports
done

,但这没有按照我的预期工作,那些2 sed cmds单独工作正常,但我无法在一个命令中找到解决方案。

他们做了什么?在" for"循环我得到一个路径(带有斜杠),对于那个路径,sed应该是grep exportfs文件(第一次出现:sed -i -n -e "\,$nfspath,p"),第二个应该删除模式",root ="到那条线的尽头。在上面的命令中,sed独立工作,并从exportfs文件中删除所有内容。我知道我应该做别的事而不是第二次" -e"对于sed,但我无法通过谷歌找到任何好的例子来做到这一点。

这个oneliner有什么问题以及如何改进它?

2 个答案:

答案 0 :(得分:2)

任何时候你在shell中编写循环只是为了操作文本你都有错误的方法。只需使用awk:

awk 'NR==FNR{a[$0];next} $1 in a{sub(/,root.*/,"")} 1' nfspaths exports

不需要显式循环,不用担心分隔符字符等。

您可以将-i inplace与GNU awk 4. *一起使用,如果您不喜欢手动指定tmp文件,或者只是将> tmp && mv tmp exports添加到行的末尾。

答案 1 :(得分:0)

我很确定你可以为s/命令提供这样的参数:

while read nfspath 
do
   sed -i -e "\,$nfspath, s/,root=.*$//" exports
done <nfspaths.list

更改为while read的个人偏好,但我认为它更清晰,更直接。

我也摆脱了g参数,因为你的锚($)意味着根据定义它会发生一次。