
次のようなテキストからスペースを削除しようとしています:
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つの文字は.
(置換側がない(正規表現では、は.
リテラルのピリオドです)。これは期待したものではありません。