【发布时间】:2011-07-20 21:10:22
【问题描述】:
我试过了:
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
【问题讨论】:
我试过了:
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
【问题讨论】:
尝试:Ctrl+V,然后按Tab。
【讨论】:
使用 ANSI-C 样式引用:$'string'
sed $'s/foo/\t/'
因此,在您的示例中,只需添加 $:
echo -e "egg\t \t\t salad" | sed -E $'s/[[:blank:]]+/\t/g'
【讨论】:
OSX 的sed 只理解模式中的根本不理解\t,而不是替换\t,因为它本质上是古老的4.2BSD sed 1982 年左右。使用文字标签(在bash 和vim 中为Ctrl+V、Tab),或安装GNU coreutils 以获得更合理的sed。
【讨论】:
" 引号内,shell 将处理反斜杠,sed 将看不到它。对于 sed 和一般的正则表达式,强烈推荐使用 ' 引用。
sed,但实际上它支持的唯一字符转义是\n。
sed 使用在 Linux 中。)
另一种选择是使用$(printf '\t') 插入标签,例如:
echo -e "egg\t \t\t salad" | sed -E "s/[[:blank:]]+/$(printf '\t')/g"
【讨论】:
Ctrl+V Tab 更便携的优势,因为您可以复制和粘贴整个命令并更轻松地共享它而不会丢失控制字符。
试试 awk
echo -e "egg\t \t\t salad" | awk '{gsub(/[[:blank:]]+/,"\t");print}'
【讨论】:
osx 上 tab 的解决方法是使用"\ ",一个转义字符后跟四个空格。
如果您尝试查找模式的最后一个实例,例如 " })};" 并在该模式后的换行符上插入文件,您在 osx 上的 sed 命令将如下所示:
sed -i '' -e $'/^\ \})};.*$/ r fileWithTextIWantToInsert' FileIWantToChange
标记不清楚:转义字符必须后跟四个空格,以便sed 在 osx 上注册制表符。
如果您要查找的模式前面有两个空格,则同样的技巧也适用,我想它也适用于查找前面有任意数量空格的模式。
【讨论】: