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
\t
sed 中制表符的语法不是标准的。该转义是GNU sed 扩展。您可以在网上找到很多使用它的示例,因为很多人使用 GNU sed(它是非嵌入式 Linux 上的 sed 实现)。但是OS X sed和其他 *BSD sed 一样,不支持\t
tab 而是将其\t
视为反斜杠后跟t
.
有很多解决方案,例如:
使用文字制表符。
sed -i.bak 's/ / /' file.txt
Run Code Online (Sandbox Code Playgroud)使用tr
或printf
产生制表符。
sed -i.bak "s/$(printf '\t')/ /" file.txt
sed -i.bak "s/$(echo a | tr 'a' '\t')/ /" file.txt
Run Code Online (Sandbox Code Playgroud)使用 bash 的字符串语法允许反斜杠转义。
sed -i.bak $'s/\t/ /' file.txt
Run Code Online (Sandbox Code Playgroud)使用 Perl、Python 或 Ruby。您发布的 Ruby 代码段确实有效。
Cri*_*itu 16
使用 Bash 特定的引用,它可以让您像在 C 中一样使用字符串,以便将真正的制表符传递给 sed,而不是转义序列:
sed -i.bak -E $'s/\t/ /' file.txt
Run Code Online (Sandbox Code Playgroud)