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

MatrixManAtYrService

我想使用sed处理Visual Studio生成的一堆文件。似乎有关的文件有些神奇之处,即使sed被赋予相同的字符串,它们也会导致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
马里奥·克莱布斯(Mario Klebsch)

猜一猜: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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

python regexp匹配组中的一个或多个字符,特殊选择除外

来自分类Dev

Python-如何一次读取一个字符的文件?

来自分类Dev

使用循环一次在一个字符中创建字符串

来自分类Dev

如何一次从python文件中读取一个字符?

来自分类Dev

给定一个包含文件名的字符串,为什么我不能在Java中拆分一个字符串?

来自分类Dev

一次在字符串的多个位置插入一个字符

来自分类Dev

在node.js中一次读取一个字符的文件?

来自分类Dev

在Swift 2.0中一次显示一个字符

来自分类Dev

一次遍历整个文件一个字符

来自分类Dev

为什么导航栏中的SwiftUI TextField一次只能接受一个字符的输入

来自分类Dev

正则表达式:一个字符的最后一次出现与另一个字符的第一次出现之间的匹配

来自分类Dev

为什么在C ++中std :: string变量一次只能接受1个字符?

来自分类Dev

为什么sed会从文件中打印第一个字符串,即使找不到匹配的组也是如此

来自分类Dev

为什么返回的字符不能由一个简单表达式中的另一个字符直接分配

来自分类Dev

循环一次在一个字符中创建字符串

来自分类Dev

给定一个包含文件名的字符串,为什么我不能在Java中拆分一个字符串?

来自分类Dev

一次更改一个字符串中的一个字符,不更改字符串吗?

来自分类Dev

一次不知道其位置匹配一个字符

来自分类Dev

sed一个模式,后跟任何单个字符一次或多次

来自分类Dev

为什么我们不能给一个字符串分配一个字符,却可以分配多个字符?

来自分类Dev

尝试从文件中打印随机行,但一次只能打印一个字符

来自分类Dev

在字符串C#中输出一个字符的一次出现

来自分类Dev

目标代码页中的文本被截断或一个或多个字符不匹配

来自分类Dev

正则表达式可以任意组合一次匹配一个字符

来自分类Dev

一次从文本文件中读取一个字符

来自分类Dev

从字符串中删除一个字符一次

来自分类Dev

为什么使用 char 变量从文件中读取一个字符又吃了一个下一个字符?

来自分类Dev

如何从列表中取出字符串并一次比较一个字符

来自分类Dev

为什么在第二次迭代中跳过第一个字符

Related 相关文章

  1. 1

    python regexp匹配组中的一个或多个字符,特殊选择除外

  2. 2

    Python-如何一次读取一个字符的文件?

  3. 3

    使用循环一次在一个字符中创建字符串

  4. 4

    如何一次从python文件中读取一个字符?

  5. 5

    给定一个包含文件名的字符串,为什么我不能在Java中拆分一个字符串?

  6. 6

    一次在字符串的多个位置插入一个字符

  7. 7

    在node.js中一次读取一个字符的文件?

  8. 8

    在Swift 2.0中一次显示一个字符

  9. 9

    一次遍历整个文件一个字符

  10. 10

    为什么导航栏中的SwiftUI TextField一次只能接受一个字符的输入

  11. 11

    正则表达式:一个字符的最后一次出现与另一个字符的第一次出现之间的匹配

  12. 12

    为什么在C ++中std :: string变量一次只能接受1个字符?

  13. 13

    为什么sed会从文件中打印第一个字符串,即使找不到匹配的组也是如此

  14. 14

    为什么返回的字符不能由一个简单表达式中的另一个字符直接分配

  15. 15

    循环一次在一个字符中创建字符串

  16. 16

    给定一个包含文件名的字符串,为什么我不能在Java中拆分一个字符串?

  17. 17

    一次更改一个字符串中的一个字符,不更改字符串吗?

  18. 18

    一次不知道其位置匹配一个字符

  19. 19

    sed一个模式,后跟任何单个字符一次或多次

  20. 20

    为什么我们不能给一个字符串分配一个字符,却可以分配多个字符?

  21. 21

    尝试从文件中打印随机行,但一次只能打印一个字符

  22. 22

    在字符串C#中输出一个字符的一次出现

  23. 23

    目标代码页中的文本被截断或一个或多个字符不匹配

  24. 24

    正则表达式可以任意组合一次匹配一个字符

  25. 25

    一次从文本文件中读取一个字符

  26. 26

    从字符串中删除一个字符一次

  27. 27

    为什么使用 char 变量从文件中读取一个字符又吃了一个下一个字符?

  28. 28

    如何从列表中取出字符串并一次比较一个字符

  29. 29

    为什么在第二次迭代中跳过第一个字符

热门标签

归档