简单的 sed 替换选项卡神秘地失败

ico*_*ast 58 osx sed regular-expression

这应该很简单,但由于某种原因它不起作用:

sed -i.bak -E 's/\t/  /' file.txt
Run Code Online (Sandbox Code Playgroud)

它不是替换制表符,而是替换t字符。我已经尝试了我能想到的所有变体,玩引用等。我在谷歌上搜索并发现其他人都使用非常相似的表达方式,他们似乎对他们有用。

-E是 OS X 的东西。我认为失败可能是 OS X 的一些奇怪怪癖的结果sed,所以我也用 Ruby 尝试了它(没有-i),并得到了相同的结果:

ruby -pe '$_.gsub!(/\t/,"  ")' < file.txt > file.new
Run Code Online (Sandbox Code Playgroud)

我在 OS X 和 iTerm 上使用 Bash 3.2.51,尽管我看不出其中任何一个是如何非常相关的。我没有设置任何奇怪的环境变量,但我可以发布您认为可能相关的任何环境变量。

可能有什么问题?

更新:当我尝试 Ruby 版本时,我一定犯了一些其他错误或错字,因为 Gilles 指出它确实有效(而且我从来没有让他误导我!)。我不确定发生了什么,但我很确定这一定是我的错误。

Gil*_*il' 83

\tsed 中制表符的语法不是标准的。该转义是GNU sed 扩展。您可以在网上找到很多使用它的示例,因为很多人使用 GNU sed(它是非嵌入式 Linux 上的 sed 实现)。但是OS X sed和其他 *BSD sed 一样,不支持\ttab 而是将其\t视为反斜杠后跟t.

有很多解决方案,例如:


Cri*_*itu 16

使用 Bash 特定的引用,它可以让您像在 C 中一样使用字符串,以便将真正的制表符传递给 sed,而不是转义序列:

sed -i.bak -E $'s/\t/  /' file.txt
Run Code Online (Sandbox Code Playgroud)

  • 似乎适用于任何 bourne shell,也适用于非 bash UNIX。但不适用于 csh 变体。 (2认同)