たとえば、テキストからスペースを削除したいとします。
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文字は次のように置き換えられます.
(交換エッジいいえリテラルピリオド.
である正規表現)。これはあなたが望むものではありません。