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

时间:2011-03-22 22:00:58

标签: regex macos sed

我试过了:

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

6 个答案:

答案 0 :(得分:74)

尝试: Ctrl + V 然后按 Tab

答案 1 :(得分:27)

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

sed $'s/foo/\t/'

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

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

答案 2 :(得分:24)

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

答案 3 :(得分:14)

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

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

答案 4 :(得分:1)

尝试awk

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

答案 5 :(得分:-1)

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

如果您尝试查找模式的最后一个实例,请说出sed并在该模式之后的换行符中插入一个文件,您在osx上的sed -i '' -e $'/^\ \})};.*$/ r fileWithTextIWantToInsert' FileIWantToChange 命令将如下所示:

sed

标记不清楚:转义字符必须后跟四个空格,以便class EmulNet { public: int ENrecv(Address *myaddr, std::function<int (void*,char*,int)> fn, struct timeval *t, int times, void *queue); }; class MP1Node{ public: int recvLoop(); int enqueueWrapper(void *env, char *buff, int size); }; int MP1Node::recvLoop() { return emulNet->ENrecv(&(memberNode->addr), std::bind(&MP1Node::enqueueWrapper,this), NULL, 1, &(memberNode->mp1q)); } 在osx上注册制表符。

如果要查找的模式前面有两个空格,则同样的技巧也有效,并且我想它也可以找到任意数量的空格后的模式。