【问题标题】:How can I insert a tab character with sed on OS X?如何在 OS X 上使用 sed 插入制表符?
【发布时间】: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

【问题讨论】:

    标签: regex macos sed


    【解决方案1】:

    尝试:Ctrl+V,然后按Tab

    【讨论】:

    • 此外,如果您在其中包含文字空格,请确保引用您的 sed 表达式,否则外壳会混淆。起初这让我很不适应。
    • 在论坛或其他地方发布代码时这很糟糕,我们不能发布文字 TAB 字符。
    • @dongiulio 根据 readline(3) 手册页,“CV”默认是带引号的插入,这意味着它将“将您键入的下一个字符逐字添加到行中。”
    • 为什么,苹果...为什么?!
    【解决方案2】:

    使用 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 也知道区别!
    • 非常有用,我同意这应该是答案,但有人可以解释为什么这个神奇的 $ 工作得这么好吗?
    【解决方案3】:

    OSX 的sed 只理解模式中的\t,而不是替换根本不理解\t,因为它本质上是古老的4.2BSD sed 1982 年左右。使用文字标签(在bashvim 中为Ctrl+VTab),或安装GNU coreutils 以获得更合理的sed

    【讨论】:

    • 真的吗?我也无法理解模式中的 \t 。我用 [[:blank:]] 代替。也许我没有正确地逃避它。 -- 谢谢。
    • " 引号内,shell 将处理反斜杠,sed 将看不到它。对于 sed 和一般的正则表达式,强烈推荐使用 ' 引用。
    • 有机会获得代码示例吗?除了满足我的好奇心之外,这并不重要。 echo -e "鸡蛋\沙拉" | sed -E 's/\t/_/' 似乎不起作用, echo -e "egg\tsalad" | sed -E 's/\\t/_/'
    • ... sigh 让我把它编辑掉。刚刚仔细检查;我认为 FreeBSD/OSX 得到了一个比 4.2BSD 更智能的sed,但实际上它支持的唯一字符转义是\n
    • 我不得不承认,我经常被这种事情绊倒,因为我的大部分经验来自 System III/V 方面的事情,尽管运行了几年的 FreeBSD,BSD 对我来说仍然有些陌生和 OS X。(我的大部分 sed 使用在 Linux 中。)
    【解决方案4】:

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

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

    【讨论】:

    • 这具有比Ctrl+V Tab 更便携的优势,因为您可以复制和粘贴整个命令并更轻松地共享它而不会丢失控制字符。
    【解决方案5】:

    试试 awk

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

    【讨论】:

      【解决方案6】:

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

      如果您尝试查找模式的最后一个实例,例如 " })};" 并在该模式后的换行符上插入文件,您在 osx 上的 sed 命令将如下所示:

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

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

      如果您要查找的模式前面有两个空格,则同样的技巧也适用,我想它也适用于查找前面有任意数量空格的模式。

      【讨论】:

        猜你喜欢
        • 2011-08-31
        • 1970-01-01
        • 2011-11-26
        • 2012-08-09
        • 2014-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多