実際の質問は-他の文字を失うリスクなしに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-
特殊文字であることが問題のようです。検索に推奨されるシンボル.
を使用することは、他の文字が削除されるリスクがあるため、良いアイデアではありません。
最初に、実際のファイルを使用するよりも、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
以下を試して、すべての「。」を「。」に置き換えてください。
sed -r 's/\. /\./g' -i sed-dots
しかし、「...」 「...」へ
sed -r 's/\. \. \./\.\.\./g' -i sed-dots
私はそれを実行したときにあなたのファイルを使用することができました:
tr '\240' ' ' < sed-dots.txt > sed-dots.new
これは変換ステップなしで機能しました:
sed 's/[[:blank:]]\.[[:blank:]]\.[[:blank:]]\./.../g' sed-dots.txt