如何在OS X上使用sed插入制表符?


68

我试过了:

echo -e "egg\t  \t\t salad" | sed -E 's/[[:blank:]]+/\t/g'

结果是:

eggtsalad

和...

echo -e "egg\t  \t\t salad" | sed -E 's/[[:blank:]]+/\\t/g'

结果是:

egg\tsalad

我想要的是:

egg salad

Answers:


89

尝试:Ctrl+ V,然后按Tab


另外,如果您在sed表达式中包含文字空格,请确保引用该表达式,否则shell会感到困惑。起初这使我绊倒了。
鲍比·杰克

2
在论坛或其他地方发布代码时,这很糟糕,我们无法发布文字TAB字符。
山姆·沃特金斯

2
@dongiulio根据readline(3)联机帮助页,默认情况下,“ CV”是带引号的插入,这意味着它将“将您键入的下一个字符逐字添加到行中”。
艾森(Aissen)

1
为什么,苹果...为什么?!
旋转

42

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

sed $'s/foo/\t/'

因此,在您的示例中,只需添加一个$

echo -e "egg\t  \t\t salad" | sed -E $'s/[[:blank:]]+/\t/g'

FWIW-如果使用vim在$带有语法打开的'sh'文件中添加$,将更改'\ t'部分的突出显示,所以即使vim也知道其中的区别!
DryLabRebel

1
非常有用,我同意这应该是答案,但是有人可以解释为什么这个神奇的$如此好用吗?
的Firat Uyulur

25

OSXsed 只能理解\t模式,根本不能理解替代品\t,因为它实际上是sed1982年左右左右遗留下来的古老4.2BSD 。使用文字标签(这bashvimCtrl+ VTab),或安装GNUcoreutils以获得更合理sed


真?我也无法理解模式中的\ t。我改用了[[:blank:]]。也许我没有正确地转义。 - 谢谢。
扎克(Zach)

"引号内,shell将处理反斜杠,并且sed看不到它。sed通常使用和正则表达式,'强烈建议使用引号。
geekosaur 2011年

有机会获得代码示例吗?除了满足我的好奇心,这并不重要。echo -e“ egg \ tsalad” | sed -E's / \ t / _ /'似乎不起作用,echo -e“ egg \ tsalad”也不起作用。sed -E's / \\ t / _ /'
Zach

……叹了口气,将其编辑掉。只是仔细检查;我想的FreeBSD / OSX已经得到了一个sed,这是稍微聪明比4.2BSD一个,但实际上它支持的唯一字符转义\n
geekosaur 2011年

我不得不承认,我经常会被这种事情绊倒,因为我的大部分经验是来自System III / V方面的,尽管我运行FreeBSD和OS X几年了,但BSD对我还是有些陌生。我的sed用法是在Linux中。)
geekosaur 2011年

15

另一个选项是用于$(printf '\t')插入选项卡,例如:

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

4
Ctrl+V Tab您可以复制和粘贴整个命令并更轻松地共享它而又不丢失控制字符的情况相比,它具有更轻便的优点。
beporter '16

1

尝试awk

echo -e "egg\t  \t\t salad" | awk '{gsub(/[[:blank:]]+/,"\t");print}'

-1

osx上制表符的一种解决方法是使用"\ ",转义字符,后跟四个空格。

如果您要查找模式的最后一个实例,请说a" })};"并在该模式之后的换行符中插入文件,则sed在osx上的命令应如下所示:

sed -i '' -e $'/^\    \})};.*$/ r fileWithTextIWantToInsert' FileIWantToChange

标记不清楚:转义字符必须后跟四个空格,以便sed在osx上注册制表符。

如果您要查找的模式前面有两个空格,那么同样的技巧也有效,我想它也可以找到任何数量的空格之后的模式。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.