【问题标题】:how to remove all whitespaces in front and beind 3 consecutive periods如何删除连续 3 个句点前后的所有空格
【发布时间】:2019-10-09 19:30:39
【问题描述】:

我正在尝试删除连续 3 个句点前后的所有空格,并将其替换为实际的椭圆符号。

我试过以下代码:

sed 's/[[:space:]]*\.\.\.[[:space:]]*/…/g'

它用椭圆符号替换了三个句点,但保留了前后的空格。

示例输入。

hello    ...   world

期望的输出

hello…world

【问题讨论】:

  • 你的 sed 命令seems to work.
  • but the spaces before and after remain - 不,他们没有,你的命令有效。
  • 我的代码确实有效。我很困惑,因为我不知道输入文件已经有省略号的空格没有被删除。

标签: bash sed removing-whitespace


【解决方案1】:

您使用的表达式是 ERE(扩展正则表达式),您必须将 -E 选项添加到 sed 以允许它,因为您在代码 [[:space:]] 中使用字符类。

sed -E 's/[[:space:]]*\.\.\.[[:space:]]*/.../g'   Input_file

没有 -E 试试:

sed 's/ *\.\.\. */.../g'  Input_file

【讨论】:

  • 我需要在不添加 -e 或 -r 标志的情况下执行此操作。我该怎么做?
  • @HenryM,如果您不想在代码中处理 ERE 并且不想使用 -E 选项,则需要删除字符类,请查看我的第二个解决方案,然后让我知道?
  • 与 min 相同的错误,尝试四个点,你会得到:hello.... world 而不是 hello .... world` 因为它有 4 个点,我认为它不应该做任何事情。
  • @HenryM,我相信在复制您的示例代码时,也会出现一些模棱两可的字符:)
【解决方案2】:

这是另一个sed

echo "hello    ...   world" | sed -E 's/ +(\.\.\.) +/\1/g'
hello...world

4 个点,什么都不做?

echo "hello    ....   world" | sed -E 's/ +(\.\.\.) +/\1/g'
hello    ....   world

【讨论】:

    【解决方案3】:

    在 bash 中,只需使用参数替换...

    foo="hello    ...    world"
    foo="${foo//+( )...+( )/...}"
    

    现在,echo "$foo",输出:

    hello...world
    

    BaSH 正则表达式变量替换的语法如下:

    ${var-name/search/replace}
    

    单个/仅替换左侧第一个匹配项,而双//替换每个匹配项。

    ?*+@! 后跟 (pattern-list) 之一替换模式列表中指定出现次数的模式,如下所示:

    ? Zero or one occurrence
    * Zero or more occurrences
    + One or more occurrences
    @ A single occurence
    ! Anything that *doesn't* match one of the occurrences
    

    模式列表可以是文字字符串或字符类的任意组合,以管道字符|分隔

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-27
      • 2021-12-20
      • 2010-12-08
      • 1970-01-01
      相关资源
      最近更新 更多