所以实际的问题是 - 有谁知道如何删除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