【问题标题】:How to remove space between distinct chars in a string using sed?如何使用sed删除字符串中不同字符之间的空格?
【发布时间】:2011-08-29 19:16:19
【问题描述】:

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

例如

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

我试过了:

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

但结果是

你好世界多迪

【问题讨论】:

  • 反向引用不在方括号中展开。这在 Perl 中更容易解决,您可以根据需要进行前瞻等。

标签: regex string sed


【解决方案1】:

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

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

【讨论】:

  • 是的,这很酷!我最终使用了@tripleee 的使用哨兵值的建议——但这很酷。谢谢!
  • @potong 使用 GNU sed 中的扩展,可以按照您的建议缩短它。我将在答案中保留更通用的形式,但这对 GNU sed 用户来说是一个不错的提示。
  • 或许s/\([^ ]\) /\1/g 就足够了?
【解决方案2】:

您不能在字符类中使用反向引用。

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

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

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

【讨论】:

  • 你打败了我。当我获得更多选票时,我会投票给你。我会将. 替换为[^ ],以确保括号中的字符不是空格。
猜你喜欢
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-23
  • 1970-01-01
  • 1970-01-01
  • 2022-11-23
  • 2023-01-31
相关资源
最近更新 更多