如何使用 sed 删除字符串中不同字符之间的空格?

发布于 2024-12-01 15:58:13 字数 281 浏览 0 评论 0原文

我想删除由空格分隔的两个不同字符之间的空格。

例如,

在字符串“hello world doddy”中,我想要 hello 和 之间有空格。 world 被删除(但保留 world 和 doddy 之间的空间,因为需要保留 dd 模式)。

我尝试过:

$ echo "hello world doddy" | sed 's/\(.\) \([^\1]\)/\1\2/g'

但最终得到了

helloworlddoddy

I want to remove the space between two distinct chars separated by space.

For example

In String "hello world doddy", I want the space between hello & world be removed (but preserve the space between world and doddy, since d d pattern needs to be preserved).

I tried:

$ echo "hello world doddy" | sed 's/\(.\) \([^\1]\)/\1\2/g'

But ended up with

helloworlddoddy

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

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

发布评论

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

评论(2

乖乖哒 2024-12-08 15:58:13

通过首先将两个相同字符之间的任何空格加倍来准备字符串。中间的空格从两个相同字符之间转变为一个字符和一个空格之间,因此可以以相同的方式检查所有空格。

echo "hello world doddy" | sed -e 's/\(.\) \1/\1  \1/g' -e 's/\(.\) \(.\)/\1\2/g'

Prep the string by first doubling any space that is between two identical characters. The intervening space shifts from being between two identical characters to between one of the characters and a space, so all spaces can be checked the same way.

echo "hello world doddy" | sed -e 's/\(.\) \1/\1  \1/g' -e 's/\(.\) \(.\)/\1\2/g'
可可 2024-12-08 15:58:13

您不能在字符类中使用 backref。

对于应该保留空间的情况,我会通过使用哨兵来解决此问题,如下所示:

echo "hello world doddy" |
sed 's/\([^ ]\) \1/\1<<>>\1/g;s/\([^ ]\) \([^ ]\)/\1\2/g;s/<<>>/ /g'

编辑:将 . 更改为 [^] 以避免处理双空格,只需更准确地说。谢谢你的建议。

You cannot use a backref inside a character class.

I would approach this by using a sentinel for those cases where the space should be preserved, like so:

echo "hello world doddy" |
sed 's/\([^ ]\) \1/\1<<>>\1/g;s/\([^ ]\) \([^ ]\)/\1\2/g;s/<<>>/ /g'

Edit: changed . to [^ ] to avoid manging double spaces, just to be more precise. Thanks for the suggestion.

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