sedのドット(。)の置換


9

だから実際の質問は-誰かが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 -Amyfile を使用した後、それらのスペースがスペースではなくM-BM-特殊文字であることが問題のようです。.他の一部の文字が削除されるリスクがあるため、検索用に提案された記号を使用することはお勧めできません。

回答:


9

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

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

$ 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

echoファイルをcatする代わりにを使用することをお勧めすることに驚いています。少なくともファイルをcatするときは、シェルが何も解釈せず、エコーもありません。
Flimm 2013年

@Flimmドットを使用した簡単な例では、これは実際には問題ではありません。ファイルからロードする場合は、気にしないでくださいcat- sed(OPの例に従って)ファイルをロードするだけで-i、インラインで保存しないでください(削除して、出力を確認してテストできます)。
Oli

@Oliそれはあなたの例では動作しますが、私のファイルでは動作しません(私の質問では、リンクがあります)。それは問題です-あなたのコマンドと他の人は動作するはずですが、それらのドットにいくつかの問題があるので動作しません。私のファイルでコマンドをテストしてください。コマンドが機能しないことがわかります。
Rafal 2013年

1
@Rafal見てみるとcat -A sed-dots、ドット間の「スペース」が特殊M-BM- 文字であることがわかります...どのようにそこに忍び込んだのかはわかりませんが、置き換える必要があります。それらをうまくターゲットにできない場合、これは機能します: sed -r 's/(\s\..\..\.)/ dot dot dot/ig' sed-dots
Oli

@オリ動作します。大いに感謝する!構文を説明できますか?副作用がなく、他のものに取って代わることはありませんか?私が見る限り、このRegExpはドットの後のすべての文字に一致します。ただし、M-BMは1文字ではなく、3文字です。では、どのように機能するのでしょうか?
Rafal 2013年

0

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

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

しかし、「……」は 「...」へ

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

0

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

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

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

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

それは動作しません。その理由は、@ Oliが見つけた奇妙なM-BM文字だと思います。
Rafal 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.