删除某些字符之前的空格

删除某些字符之前的空格

我正在尝试从文本中删除空格,例如:

Ala ma kota ,psa i kanarka
, chyba . . .

为了得到

Ala ma kota,psa i kanarka, chyba...

我正在尝试使用sed命令:

echo $'Ala ma kota ,psa i kanarka\n, chyba . . .' | sed 's/ ,/,/g' | sed 's/ ././g'

它可以工作,,但对于点或新线仍然存在问题。它取代两者.,而不是同时取代两者。

(我使用的是 Linux。)

答案1

使用 GNU sed(您拥有它是因为您标记了此 Linux):

$ echo $'Ala ma kota ,psa i kanarka\n, chyba . . .' | sed -zE 's/[[:space:]]([,.?!])/\1/g'
Ala ma kota,psa i kanarka, chyba...

怎么运行的

  • -z

    这告诉 sed 一次读入所有文本,而不是一次读一行。

  • -E

    这告诉 sed 使用扩展的正则表达式语法。这消除了一些难看的反斜杠的需要。

  • s/[[:space:]]([,.?!])/\1/g

    ,这将替换、.?或之一后的任何空格!,仅使用标点符号。

    如果您想包含其他标点符号,只需将它们添加到带有 的方括号之间,.?!

    [[:space:]]不仅包括空格,还包括制表符和换行符等。

变化

这个版本有一个或者更多标点符号之前的空白字符:

$ echo $'Ala ma kota   ,psa i kanarka  \n, chyba . . .' | sed -zE 's/[[:space:]]+([,.?!])/\1/g'
Ala ma kota,psa i kanarka, chyba...

讨论

问题中,有:

s/ ././g

请注意,在正则表达式中,.是通配符:它匹配任何内容。因此,.匹配一个空白,后跟任何特点。这两个字符被替换为.(因为替换边是不是正则表达式,.是字面句号)。这不是你所希望的。

相关内容