替换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-特殊字符的问题。.建议使用任何建议的符号进行搜索不是一个好主意,因为可能会删除某些其他字符。

Answers:


10

首先,我将使用进行测试,echo然后将其管道sed传输到,而不是使用真实文件。其次,您可以{n}在扩展的正则表达式模型中使用来表示倍数和限制。

您几乎在那里,但是您的正则表达式期望有领先的空间。

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

请注意,\s?仍然足够贪婪地破坏输出,因此我在输出中添加了一个空格。您可能不想要那样。我还将空间设为可选,因此它将与以下所有内容匹配:

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

只需删除可选?标志。


考虑到unicode的问题(在注释中),您可以将数据强制为ASCII等效,iconv然后将其存储:

$ 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而不是添加文件,至少当您添加一个文件时,您知道该外壳程序没有解释任何内容,而且回声也没有。
Flimm 2013年

@Flimm是一个带有点的简单示例,这实际上不是问题。如果要从文件加载,请不要打扰cat-只需sed加载文件(按照OP的示例),而不保存内联(删除-i,这样您就可以查看并测试输出)。
奥利(Oli)

@Oli它适用于您的示例,但不适用于我的文件(在我的问题中,有一个链接)。那是个问题-您的命令和其他命令应该起作用,但是它们不起作用,因为这些点存在一些问题。请在我的文件上测试您的命令,您将看到它不起作用。
拉法尔

1
@Rafal如果您看一下,cat -A sed-dots您会发现点之间的“空格”是特殊M-BM- 字符...不确定它们如何潜入其中,但需要替换。如果不能很好地将它们作为目标,则可以这样做: sed -r 's/(\s\..\..\.)/ dot dot dot/ig' sed-dots
Oli

@Oli有效。非常感谢!您能解释一下语法吗?您确定它没有任何副作用并且不会替代任何其他东西吗?据我所知,此RegExp将匹配点后的任何字符。但是,M-BM不是一个字符,而是三个。那么它怎么可能工作呢?
拉法尔

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字符。
拉法尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.