web-dev-qa-db-ja.com

sedのドット(。)の置き換え

実際の質問は-他の文字を失うリスクなしにM-BM-特殊文字を削除する方法を知っている人はいますか?

私はテキストの文字列を持っています:

" . . ."

あれは

space dot space dot space dot

私はテキストファイル内のこの文字列のすべての出現を置換しようとしています

"..."

あれは

dot dot dot

私はsedでやろうとしていた:

sed -r 's:\s\.\s\.\s\.:...:g' -i sed-dots

残念ながら、入力ファイルは少しでも変更されません。ファイル: https://www.dropbox.com/s/46zmiruy3ln85a1/sed-dots

テキストエディターで同じ文字列を置換しようとすると(geanyを使用)、適切に検出されて置換されます。

私が考えることができる唯一の理由は、これらのスペースの一部(またはすべて)が実際にはスペースではなく、何らかの特殊文字であるということです。

誰もがその文字列を見つけてsed(または他のコマンドラインツール)で置き換える方法を知っていますか?私のファイルであなたのアイデアをテストしてください、問題はそれが思われるほど明白ではないので-私はそれについて私が尋ねた理由です。

cat -A myfileを使用した後、これらのスペースはスペースではなく、M-BM-特殊文字であることが問題のようです。検索に推奨されるシンボル.を使用することは、他の文字が削除されるリスクがあるため、良いアイデアではありません。

9
Rafal

最初に、実際のファイルを使用するよりも、echoでテストし、それをsedにパイプすることから始めます。次に、拡張正規表現モデルで{n}を使用して、倍数と制限を示すことができます。

あなたはほとんどそこにいましたが、あなたの正規表現は一流のスペースを期待していました。

$ echo 'cheese . . . muffins' | sed -r 's/(\s?\.){3}/ dot dot dot/g'
cheese dot dot dot muffins

\s?は依然として出力を台無しにするほど欲張りなので、出力にスペースを追加しました。あなたはそれを望まないかもしれません。スペースもオプションにしたので、次のすべてに一致します。

...
. ..
.. .
. . .
 . . . 

オプションの?フラグを削除するだけです。


(コメント内の)unicodeの問題を考えると、データをASCIIと同等にiconvに強制してから、sedすることができます。

$ iconv -f utf-8 -t ascii//translit sed-dots | sed -r 's/(\s?\.){3}/ dot dot dot/g'
Lorem ipsum dot dot dot
Some dot dot dot more text
9
Oli

以下を試して、すべての「。」を「。」に置き換えてください。

sed -r 's/\. /\./g' -i sed-dots

しかし、「...」 「...」へ

sed -r 's/\. \. \./\.\.\./g' -i sed-dots
0
Meer Borg

私はそれを実行したときにあなたのファイルを使用することができました:

tr '\240' ' ' < sed-dots.txt > sed-dots.new

これは変換ステップなしで機能しました:

sed 's/[[:blank:]]\.[[:blank:]]\.[[:blank:]]\./.../g' sed-dots.txt
0
Scrutinizer