为什么 sed 不能在这个文件中一次匹配一个以上的字符?
Why can't sed match more than one character at a time in this file?
我想使用 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
只是猜测:来自 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
逐个字符地转储输入数据,对不可打印的字符使用本地代码。
对于第一个命令,我在 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
我想使用 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
只是猜测:来自 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
逐个字符地转储输入数据,对不可打印的字符使用本地代码。
对于第一个命令,我在 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