【发布时间】:2016-02-15 22:32:46
【问题描述】:
编者注:
后来在事后对标题进行了修改;有两个明显的问题:
(a) 原来输入文件有 \r-only (CR-only) 行尾(经典 Mac OS 风格)
(b) 尝试在sed 正则表达式中使用\t 和\r 失败,因为BSD Sed(在OSX 上使用)不支持这种转义。
我正在开发一个 Automator 程序,该程序使用 Python 来查找和替换文本文件中的某些单词。该程序使用字典,并且在某些情况下用作替换的值是''(意思是什么都没有)。我不认为该程序导致了这个问题,但我只是通过上下文提及这一点。 (我认为问题在于sed,所以我不愿意标记Python。)
文件中的某些行具有前导空格,这些空格是在文件开头的某些单词被空替换后无意中创建的。我想摆脱它们,我认为sed 是这种情况下工作的最佳工具。
假设这是文本文件的样子:
Display
Display
BOX,
所以我正在使用 sed 运行编辑过的文件:
sed -e 's/^[ \t]*//g'
这是结果:
Display
Display
BOX,
仅编辑第一个匹配项。为什么?
通过测试,我创建了一个全新的纯文本文件,如下所示:
hello
hello
hello
然后我运行上面的命令。这实际上按预期工作。为什么?
是否有可能使用了由 Python 程序创建的其他形式的空间(不可打印的字符?)?但那为什么sed 至少会工作一次呢?
顺便说一句,我愿意接受另一种与 OS X 兼容的便携式解决方案或工具,用于修剪纯文本文件中每一行的前导空白。
编辑:这是文件的一些xxd 输出(用X 替换了大多数实际内容):
0000000: 2044 6973 706c 6179 2043 616c 6962 7261 X X
0000010: 7469 6f6e 2046 6978 7475 7265 2046 4952 X X X
0000020: 4d57 4152 4520 4b49 545e 4d20 4469 7370 X X^M X
0000030: 6c61 7920 4361 6c69 6272 6174 696f 6e20 X X
0000040: 4669 7874 7572 6520 524d 6163 426f 6f6b X X
0000050: 2041 6972 2028 3131 2d69 6e63 682c 204d X X
0000060: 6964 2032 3031 3229 2050 4f52 5420 4b49 X X) X X
0000070: 545e 4d42 4f58 2c20 5245 434f 5645 5259 T^MBOX, X
【问题讨论】:
-
cat -v为该输入文件显示什么? -
cat -v在带有空格的行和除第一行之外的所有其他行的开头显示^M。每行都以^M开头,因为我相信它是回车符。这些空格似乎只是一个常规空格。 -
它们不是常规空间。如果您将该文件通过管道传送到
xxd,您可以看到它们实际上是什么。 -
您是否将
cat -v的输出通过管道传输到xxd?它显示文字^M。您必须通过管道传输未修改的文件以理解xxd输出。 -
sed是一个面向行的流编辑器。整个文本被sed视为单行。这意味着正则表达式^行首仅适用于第一个单词Display,因为文件的其余部分是延续。您可能希望将这些回车符转换为换行符。