特定の文字の前のスペースを削除

特定の文字の前のスペースを削除

たとえば、テキストからスペースを削除したいとします。

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が一度に1行ずつ読み込むのではなく、すべてのテキストを一度に読み取るように指示します。

  • -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

正規表現では.ワイルドカードなので、何でも一致します。したがって、.スペースの後に一致します。どの特徴。 2文字は次のように置き換えられます.(交換エッジいいえリテラルピリオド.である正規表現)。これはあなたが望むものではありません。

関連情報