在 sed 中替换点 (.)

在 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 (或任何其他命令行工具) 查找和替换该字符串吗?请在我的文件上测试您的想法,因为问题并不像看起来那么明显 - 这就是我问这个问题的原因。

使用 myfile 后,cat -A似乎存在一个问题,即这些空格不是空格,而是M-BM-特殊字符。使用任何.建议的符号进行搜索都不是一个好主意,因为存在删除其他字符的风险。

答案1

首先,我会先进行测试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

答案2

尝试以下方法将所有“。”替换为“。”

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

但对于“...”到“...”

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

答案3

我运行你的文件时可以使用它:

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

这无需转换步骤即可完成:

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

相关内容