I have tried:
echo -e \"egg\\t \\t\\t salad\" | sed -E \'s/[[:blank:]]+/\\t/g\'
Which results in:
eggtsalad
OSX's sed
only understands doesn't understand \t
in the pattern, not in the replacement\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
.
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.
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"
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'
try awk
echo -e "egg\t \t\t salad" | awk '{gsub(/[[:blank:]]+/,"\t");print}'
Try: Ctrl+V and then press Tab.