Unix diff忽略以序列结尾的行

时间:2012-08-24 08:26:23

标签: bash shell unix

我有两个文件

档案1

INFO  : temp0 Directory
            created
INFO  : temp0 Directory created

file2的

INFO  : reuse temp1

因此,在区分这两个文件时,我想忽略以Directory created结尾的语句。 我写了

diff -I 'Directory created' file1 file2

因此,此语句成功忽略了file1的第二行,但它没有忽略在单独行中包含Directory created的第一行。

所以,如果有人知道解决方案,请帮助我!

2 个答案:

答案 0 :(得分:0)

基本上 - 如果差异中的所有行匹配,我将仅匹配 。在您描述的情况下 - 条件不成立。

diff -I "INFO" 1 2 | grep -v "Directory created"

可能适合您,但它不能正确计算差异块边界

希望有所帮助

答案 1 :(得分:0)

嗯,我认为最简单的解决方案是从第一个文件中过滤掉这些行。例如,您可以使用以下awk脚本执行此操作:

# if line contains 'Directory created', just skip it.
/Directory created/ {
    had_dir = ""
    next
}

# if line contains sole 'Directory', store it and lookup next line.
/Directory/ {
    had_dir = $0
    next
}

# if line contains sole 'created' and we stored a line (which means
# it contained 'Directory'), then delete the stored one and skip
# (effectively, skip both).
/created/ && had_dir {
    had_dir = ""
    next
}

# otherwise, if we stored a line, print it.
had_dir {
    print had_dir
    had_dir = ""
}

# and print the current line.
{
    print
}

如果您的输入更复杂,您可能需要稍微调整一下正则数据。

然后,使用脚本过滤掉第一个文件:

$ awk -f script.awk file1 | diff - file2
0a1
> INFO  : reuse temp1

请注意,您将-作为第一个参数传递给diff,以使其读取awk的管道输出而不是文件。

同时请注意,线偏移将不再正确。