How can I insert a tab character with sed on OS X?
我已经尝试过:
1
| echo -e"egg\t \t\t salad" | sed -E 's/[[:blank:]]+/\t/g' |
结果是:
还有…
1
| echo -e"egg\t \t\t salad" | sed -E 's/[[:blank:]]+/\\t/g' |
结果是:
我想要什么:
尝试:ctrl+v,然后按t。
- 谢谢,正是我需要的。
- 另外,如果在SED表达式中包含文本空白,请确保引用它,否则shell会感到困惑。一开始我被这个绊倒了。
- 这不适用于fishshell
- 当在论坛中发布代码或其他内容时,这很糟糕,我们不能发布文本标签字符。
- 有趣的是,ctrl+v的作用是什么?为什么会这样?
- @Dongiulio根据readline(3)手册页,"C-V"默认为带引号的插入,这意味着它将"逐字添加您键入的下一个字符"。
使用ansi-c型报价:$'string'。
因此,在您的示例中,只需添加一个$:
1
| echo -e"egg\t \t\t salad" | sed -E $'s/[[:blank:]]+/\t/g' |
- 这个应该是公认的答案!
- 哇,直到现在才发现这个功能!
- 这很酷,肯定需要被接受的答案。
- 这绝对是最好的答案!
osx的sed只理解模式中的\t,而不是替换模式中的\t,根本不理解\t,因为它本质上是1982年或此后留下的4.2bsd sed。使用文字标签(在bash和vim中为Ctrl+V、Tab或安装gnu coreutils以获得更合理的sed。
- 真的?我也无法理解这个模式。我用了[:空白:]代替。也许我没有正确地逃脱。谢谢。
- 在"引号中,shell将处理反斜杠,sed将看不到它。对于sed和regex,一般来说,'引用是非常可取的。
- 有没有可能有代码样本?除了满足我的好奇心,这并不重要。echo-e"egg salad"sed-e's/ ///似乎不起作用,echo-e"egg salad"sed-e's/\t///也不起作用。
- …叹气,让我把它删掉。我想Freebsd/OSX已经得到了一个比4.2bsd稍聪明的sed,但实际上它支持的唯一字符转义是
。
- 我不得不承认,我经常被这种事情绊倒,因为我的大部分经验都来自于系统III/V方面,尽管BSD运行了几年FreeBSD和OS X,但它对我来说还是有点陌生(而且我的大多数sed的使用都在Linux中)。
- 哦,好吧,它适用于我需要它的地方,但是OS X不能处理 、s等等,这很烦人。-不管怎样,谢谢。
- 显然不是1982年的古埃多克斯1〔2〕,因为那时它就不理解埃多克斯1〔9〕。posix没有描述sed中的\t支持。因此,支持这一点是不合情理的。将\t转换为tab会破坏shell脚本,这些脚本依赖于sed而不是这样做。
另一种选择是使用$(printf '\t')插入选项卡,例如:
1
| echo -e"egg\t \t\t salad" | sed -E"s/[[:blank:]]+/$(printf '\t')/g" |
- 这样做的优点是比Ctrl+V Tab更易于移植,因为您可以复制和粘贴整个命令,并更容易地共享它,而不会丢失控制字符。
尝试AWK
1
| echo -e"egg\t \t\t salad" | awk '{gsub(/[[:blank:]]+/,"\t");print}' |