首页 > 解决方案 > 使用 sed 向后删除特定的空格

问题描述

我试图删除字符串中的最后一个空格。

输入是:

"hi guys how you doing"

我目前在做什么:

$ echo "hi guys how you doing" | sed 's/ \+//1'

电流输出:

"higuys how you doing"

预期输出:

"hi guys how youdoing"

这个字符串只是例如,在我的应用程序中,我不知道空格的确切位置,我只知道它在最后一个空白位置。

你知道它是否存在在没有 rev 命令的情况下向后搜索字符串的任何方法?

标签: regexlinuxsedwhitespace

解决方案


您可以使用

sed 's/\(.*[^[:space:]]\)[[:space:]]\{1,\}/\1/'
sed 's/[[:space:]]\{1,\}\([^[:space:]]*\)$/\1/'

如果您的sed支持\s\S并且如果您更喜欢 POSIX ERE,您可以使用

sed -E 's/(.*\S)\s+/\1/'
sed -E 's/\s+(\S*)$/\1/'

查看sed演示

s="hi guys how you doing"
sed 's/\(.*[^[:space:]]\)[[:space:]]\{1,\}/\1/' <<< "$s"
# => hi guys how youdoing

细节

  • \(.*[^[:space:]]\)[[:space:]]\{1,\}/(.*\S)\s+在最后一个非空白字符之前尽可能多地匹配并捕获任何零个或多个字符到第 1 组,并匹配其后的 1 个或多个空白字符
  • [[:space:]]\{1,\}\([^[:space:]]*\)$/\s+(\S*)$匹配 1+ 个空格,然后匹配并捕获字符串末尾的第 1 组零个或多个非空格字符。

推荐阅读