如何在OS X上插入带有sed的制表符?

Zac*_*ach 65 regex macos sed

我试过了:

echo -e "egg\t  \t\t salad" | sed -E 's/[[:blank:]]+/\t/g'
Run Code Online (Sandbox Code Playgroud)

结果如下:

eggtsalad
Run Code Online (Sandbox Code Playgroud)

和...

echo -e "egg\t  \t\t salad" | sed -E 's/[[:blank:]]+/\\t/g'
Run Code Online (Sandbox Code Playgroud)

结果如下:

egg\tsalad
Run Code Online (Sandbox Code Playgroud)

我想要的是什么:

egg salad
Run Code Online (Sandbox Code Playgroud)

yan*_*yan 81

尝试:Ctrl+ V然后按Tab.

  • 有趣的是CTRL + V有什么作用?为什么这样有效? (6认同)
  • 这不适用于`fish` shell (2认同)
  • 在论坛或其他地方发布代码时,这很烂,我们无法发布文字TAB字符。 (2认同)
  • @dongiulio根据readline(3)联机帮助页,默认情况下,“ CV”是带引号的插入内容,这意味着它将“将您键入的下一个字符逐字添加到行中”。 (2认同)

wis*_*cky 34

使用ANSI-C样式引用: $'string'

sed $'s/foo/\t/'
Run Code Online (Sandbox Code Playgroud)

所以在你的例子中,只需添加一个$:

echo -e "egg\t  \t\t salad" | sed -E $'s/[[:blank:]]+/\t/g'
Run Code Online (Sandbox Code Playgroud)

  • 这个应该是公认的答案! (3认同)

gee*_*aur 24

OSX sed 只能\t在模式中理解,而不是在替换中根本不理解\t,因为它基本上是sed从1982年或之后遗留下来的古老的4.2BSD .使用文字标签(这bashvimCtrl+ V,Tab),或安装GNU coreutils以获得更合理sed.


rob*_*nst 15

另一种选择是使用$(printf '\t')插入标签,例如:

echo -e "egg\t  \t\t salad" | sed -E "s/[[:blank:]]+/$(printf '\t')/g"
Run Code Online (Sandbox Code Playgroud)

  • 这样做的优点是比"Ctrl + V Tab"更便携,因为您可以复制并粘贴整个命令并更轻松地共享它而不会丢失控制字符. (4认同)