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

Regex 如何在OS X上使用sed插入制表符?,regex,macos,sed,Regex,Macos,Sed,我试过: echo -e "egg\t \t\t salad" | sed -E 's/[[:blank:]]+/\t/g' 其结果是: eggtsalad egg\tsalad 而且 echo -e "egg\t \t\t salad" | sed -E 's/[[:blank:]]+/\\t/g' 其结果是: eggtsalad egg\tsalad 我想要的是: egg salad 尝试:Ctrl+V,然后按Tab。OSX的sed只理解模式中的\t,而不是替换模式中的\t

我试过:

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

eggtsalad
egg\tsalad
而且

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

eggtsalad
egg\tsalad
我想要的是:

egg salad
尝试:Ctrl+V,然后按Tab。

OSX的
sed
只理解模式中的
\t
,而不是替换模式中的
\t
,因为它本质上是1982年左右遗留下来的古老的4.2BSD
sed
。使用文本选项卡(在
bash
vim
中是
Ctrl
+
V
tab
),或者安装GNU
coreutils
以获得更合理的
sed

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

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

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

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

sed $'s/foo/\t/'
因此,在您的示例中,只需添加一个
$

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

osx上tab的一个解决方法是使用
“\”
,一个转义字符,后跟四个空格

如果您试图查找模式的最后一个实例,例如a
“}”);“
并在该模式之后的换行上插入一个文件,那么osx上的
sed
命令如下所示:

sed -i '' -e $'/^\    \})};.*$/ r fileWithTextIWantToInsert' FileIWantToChange
标记使其不清晰:转义字符后面必须有四个空格,以便
sed
在osx上注册制表符


如果要查找的模式前面有两个空格,同样的技巧也会起作用,我想它也可以用于查找前面有任意数量空格的模式。

真的吗?我也无法让sed理解模式中的\t。我用了[[:blank:]代替。也许我没有很好地逃避它谢谢。在
引号内,shell将处理反斜杠,而
sed
将看不到它。对于
sed
,以及一般的正则表达式,
引号是最受欢迎的。有没有可能得到一个代码示例?除了满足我的好奇心之外,这并不重要。echo-e“egg\tsalad“| sed-E的/\t//”似乎不起作用,echo-E的“egg\tsalad”| sed-E的/\\t//”。。。让我编辑一下。只是重复检查;我原以为FreeBSD/OSX得到了一个比4.2BSD稍微聪明一点的
sed
,但实际上它支持的唯一字符转义是
\n
。我必须承认,我经常会被这类事情绊倒,因为我的大部分经验都来自System III/V方面,尽管多年来一直运行FreeBSD和OS X,BSD对我来说还是有些陌生。(而且我大部分的
sed
用法都是在Linux中使用的。)此外,如果在其中包含文字空白,请确保引用您的sed表达式,否则,shell会变得混乱。这让我一开始就大吃一惊。在论坛或其他地方发布代码时,这很糟糕,我们不能发布文字制表符。@dongiulio根据readline(3)手册页,“C-V”默认为带引号的插入,这意味着它将“逐字添加到行中的下一个字符。”为什么,苹果。。。为什么?这比
Ctrl+V Tab
更具可移植性,因为您可以在不丢失控制字符的情况下复制和粘贴整个命令并更轻松地共享它。FWIW-如果您在启用语法的“sh”文件中添加$using vim,将更改“\t”部分的突出显示,因此即使是vim也知道区别!非常有用,我同意这应该是答案,但有人能解释为什么这个神奇的美元工作得这么好吗?