
我正在嘗試從文字中刪除空格,例如:
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
請注意,在正規表示式中,.
是通配符:它符合任何內容。因此,.
匹配一個空白,後跟任何特點。這兩個字元被替換為.
(因為替換邊是不是正規表示式,.
是字面句號)。這不是你所希望的。