在第二个文件上使用sed -i grep一个文件并删除grep的内容

时间:2014-03-29 18:00:49

标签: sed grep

我正在尝试从一个文件中grep ip地址,并使用一个命令从第二个文件中删除grep的内容。

主文件有

header x.x.x.x
header x.x.x.x
header2 y.y.y.y
header2 y.y.y.y
header3 z.z.z.z
header3 z.z.z.z

临时文件有

x.x.x.x
x.x.x.x
y.y.y.y
y.y.y.y
z.z.z.z
z.z.z.z

尝试

grep "header" masterfile | sed 's/^.* //' | sed -i "" '/$/d' tempfile

在sed命令删除条目后,还要删除空行。

2 个答案:

答案 0 :(得分:3)

如果我理解正确,您需要以下内容:

grep -v -F -f <(grep '\<header\>' masterfile | cut -d' ' -f2) tempfile

grep -v -F -f <(sed 's/^header *//' masterfile) tempfile

为了您的输入,它会产生:

y.y.y.y
y.y.y.y
z.z.z.z
z.z.z.z

为了将更改保存到tempfile,您可以将命令输出重定向到另一个文件并将其移动到所需的文件:

grep -v -F -f <(sed 's/^header *//' masterfile) tempfile > tmp && mv tmp tempfile

编辑:您似乎是sh,它不支持进程替换。在这种情况下,您可以使用以下内容:

grep '\<header\>' master | cut -d' ' -f2 | grep -v -F -f - tempfile

答案 1 :(得分:2)

从第一个文件生成sed脚本,并将其提供给第二个sed实例。

sed 's%^header \(.*\)%/^\1\$/d%' masterfile |
sed -i "" -f - tempfile

在Linux上,-f -表示从标准输入读取脚本。在其他一些平台上,这不起作用;然后,您必须将脚本保存到临时文件中(或者您可能有/dev/fd/1/dev/stdin)。