我试过了:
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
答案 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年或后来遗留下来。使用文字标签(bash
和vim
为Ctrl
+ V
,Tab
),或安装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上注册制表符。
如果要查找的模式前面有两个空格,则同样的技巧也有效,并且我想它也可以找到任意数量的空格后的模式。