在diff命令中忽略带有反斜杠的模式

时间:2016-12-19 08:48:00

标签: regex bash shell diff backslash

文件foo.c:

do {                                                            
    a=b;
    c=d;
 } while (0)

文件bar.c

do {                                                            
    a=b;
    c=d;
\
} while (0)

在shell脚本中,上述2个文件的差异为:

  

diff foo.c bar.c

<   } while (0)
---
>     \
>   } while (0)

我试图使用

忽略这个差异
  

diff -I“reg-ex pattern”

我尝试了"\s}\swhile\s(0)""} while (0)"等模式。但没有用。有可能忽略上述情况吗?如果不是“差异”,任何其他实用程序?

2 个答案:

答案 0 :(得分:1)

您可以通过使用sed删除不需要的行来实现。然后忽略差异。

foo.c和bar.c之间存在2个差异

  1. \
  2. 对齐
  3. foo.c中}之前有一个空格
  4. 您可以这样做:

    diff -I '\s\?}' <(sed '/^\\/d' bar.c) foo.c
    

    使用sed删除\行并忽略foo.c中的空格

答案 1 :(得分:1)

试试这个:

pat='^[[:space:]]*\\[[:space:]]*$'
sub_pat='s/'"$pat"'//'
diff -B -I "$pat" <(sed -e "$sub_pat" foo.c) <(sed -e "$sub_pat" bar.c)

第一行将正则表达式存储到pat变量中,用于下一个diffsed命令。正则表达式匹配带有反斜杠(\\)的行,可选择用空格字符包围。

sed命令将匹配$pat模式的行替换为空字符串(-B选项导致diff忽略空行。)

如果没有额外的工具,就不可能从diff的输出中过滤出反斜杠,除非唯一的区别在于包含被忽略的模式的行:

  

对于每个不可忽略的变化,`diff'打印其附近的一整套变化,包括可忽略的变化。

有关详细信息,请参阅this question的答案。