如何在 OS X 上使用 sed 插入制表符?

发布于 2024-10-25 22:54:56 字数 351 浏览 1 评论 0原文

我已经尝试过:

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

I have tried:

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

Which results in:

eggtsalad

And...

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

Which results in:

egg\tsalad

What I would like:

egg salad

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

凉宸 2024-11-01 22:54:57

尝试 awk

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

try awk

echo -e "egg\t  \t\t salad" | awk '{gsub(/[[:blank:]]+/,"\t");print}'
孤芳又自赏 2024-11-01 22:54:57

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

如果您试图找到模式的最后一个实例,请说 " })};" 并在该模式后的换行符上插入文件,您的 sed 命令osx 看起来像这样:

sed -i '' -e 

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

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

/^\ \})};.*$/ r fileWithTextIWantToInsert' FileIWantToChange

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

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

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 

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.

/^\ \})};.*$/ 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.

只涨不跌 2024-11-01 22:54:56

尝试:Ctrl+V,然后按Tab

Try: Ctrl+V and then press Tab.

无人问我粥可暖 2024-11-01 22:54:56

使用 ANSI-C 样式引用: $'string'

sed 

因此,在您的示例中,只需添加 $

echo -e "egg\t  \t\t salad" | sed -E 
s/foo/\t/'

因此,在您的示例中,只需添加 $


s/[[:blank:]]+/\t/g'
s/foo/\t/'

因此,在您的示例中,只需添加 $

Use ANSI-C style quoting: $'string'

sed 

So in your example, simply add a $:

echo -e "egg\t  \t\t salad" | sed -E 
s/foo/\t/'

So in your example, simply add a $:


s/[[:blank:]]+/\t/g'
s/foo/\t/'

So in your example, simply add a $:

我一向站在原地 2024-11-01 22:54:56

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

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.

瞎闹 2024-11-01 22:54:56

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

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

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"
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文