刪除某些字元之前的空格

刪除某些字元之前的空格

我正在嘗試從文字中刪除空格,例如:

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

請注意,在正規表示式中,.是通配符:它符合任何內容。因此,.匹配一個空白,後跟任何特點。這兩個字元被替換為.(因為替換邊是不是正規表示式,.是字面句號)。這不是你所希望的。

相關內容