How can I insert a tab character with sed on OS X?

后端 未结 6 1487
野的像风
野的像风 2020-11-29 23:20

I have tried:

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

Which results in:

eggtsalad
相关标签:
6条回答
  • 2020-11-30 00:02

    OSX's sed only understands \t in the pattern, not in the replacement doesn't understand \t at all, since it's essentially the ancient 4.2BSD sed left over from 1982 or thenabouts. Use a literal tab (which in bash and vim is Ctrl+V, Tab), or install GNU coreutils to get a more reasonable sed.

    0 讨论(0)
  • 2020-11-30 00:04

    A workaround for tab on osx is to use "\ ", an escape char followed by four spaces.

    If you are trying to find the last instance of a pattern, say a " })};" and insert a file on a newline after that pattern, your sed command on osx would look like this:

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

    The markup makes it unclear: the escape char must be followed by four spaces in order for sed to register a tab character on osx.

    The same trick works if the pattern you want to find is preceded by two spaces, and I imagine it will work for finding a pattern preceded by any number of spaces as well.

    0 讨论(0)
  • 2020-11-30 00:14

    Another option is to use $(printf '\t') to insert a tab, e.g.:

    echo -e "egg\t  \t\t salad" | sed -E "s/[[:blank:]]+/$(printf '\t')/g"
    
    0 讨论(0)
  • 2020-11-30 00:18

    Use ANSI-C style quoting: $'string'

    sed $'s/foo/\t/'
    

    So in your example, simply add a $:

    echo -e "egg\t  \t\t salad" | sed -E $'s/[[:blank:]]+/\t/g'
    
    0 讨论(0)
  • 2020-11-30 00:22

    try awk

    echo -e "egg\t  \t\t salad" | awk '{gsub(/[[:blank:]]+/,"\t");print}'
    
    0 讨论(0)
  • 2020-11-30 00:23

    Try: Ctrl+V and then press Tab.

    0 讨论(0)
提交回复
热议问题