特定の文字の前の空白を削除する

特定の文字の前の空白を削除する

次のようなテキストからスペースを削除しようとしています:

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 にタグを付けたので、GNU sed が使用可能です)。

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

使い方

  • -z

    これは、一度に 1 行ずつ読み取るのではなく、すべてのテキストを一度に読み取るように 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

正規表現では、は.ワイルドカードであり、何にでもマッチします。つまり、.は空白に続いてどれでも文字。これらの2つの文字は.(置換側がない(正規表現では、は.リテラルのピリオドです)。これは期待したものではありません。

関連情報