为什么sed不能在此文件中一次匹配多个字符?

时间:2016-10-27 18:36:23

标签: visual-studio sed cygwin

我想使用sed来处理visual studio生成的一堆文件。似乎有问题的文件会导致sed表现不同,即使它被赋予相同的字符串:

生成相同字符串的两种方案:

$ echo "#endif    // not APSTUDIO_INVOKED"
#endif    // not APSTUDIO_INVOKED

$ cat Version.rc.in | tail -n 3 | head -n 1
#endif    // not APSTUDIO_INVOKED

在任何一种情况下,我都可以一次替换一个角色:

$ echo "#endif    // not APSTUDIO_INVOKED" | sed 's/A/B/'
#endif    // not BPSTUDIO_INVOKED

$ cat Version.rc.in | tail -n 3 | head -n 1 | sed 's/A/B/'
#endif    // not BPSTUDIO_INVOKED

但是当我尝试替换多个字符时,文件输出失败,但回显输出成功。

$ echo "#endif    // not APSTUDIO_INVOKED" | sed 's/AP/B/'
#endif    // not BSTUDIO_INVOKED

$ cat Version.rc.in | tail -n 3 | head -n 1 | sed 's/AP/B/'
#endif    // not APSTUDIO_INVOKED

进一步的修补让我确信这个限制与sed能够匹配超过一个字符长的字符串有关。例如,'s/A/XXX/'有效但's/AP/BB/'没有。

为什么?

我在Windows Server 2012上使用Cygwin

$ uname -a
CYGWIN_NT-6.3 MattsWinBox 2.3.1(0.291/5/3) 2015-11-14 12:44 x86_64 Cygwin

1 个答案:

答案 0 :(得分:2)

Jut a guess:来自visual studio的文件可能正在使用UTF-16编码,每个字符需要两个字节,而sed可能不知道它。您尝试以下命令检查:

echo "#endif    // not APSTUDIO_INVOKED" | od -c
cat Version.rc.in | tail -n 3 | head -n 1 | od -c

od -c使用本地代码转储不可打印字符的char输入数据char。

对于第一个命令,我在linux上获得以下输出:

0000000   #   e   n   d   i   f                   /   /       n   o   t
0000020       A   P   S   T   U   D   I   O   _   I   N   V   O   K   E
0000040   D  \n
0000042