Raf*_*fal 9 command-line bash sed
我有通过使用 LibreOffice 将 DOCX 文档中的内容复制到文本文件中创建的文件。我修改了文件sed以删除额外的空格和其他内容,但后来我注意到空间不受常规命令的影响:
sed -r 's:some-text :some-text:g' -i file
Run Code Online (Sandbox Code Playgroud)
使用后cat -A file我发现这看起来像这样:
<p>M-BM- Lorem ipsum</p>
Run Code Online (Sandbox Code Playgroud)
如何删除它?
ste*_*ver 17
的M-BM-字符是字节序列的ASCII表示0xc2 0xa0,这是Unicode字符的UTF8编码A0-一个非间断空格字符。可以使用键序列Ctrl+ Shift+将此字符插入到 LibreOffice 和 Microsoft Word 文档中SPACE。
例如,如果我们在 LibreOffice 中创建一个新的 .odt 文档并键入 ABC Ctrl+ Shift+ SPACEDEF,那么Save As... Text(忽略该文档可能包含无法以该格式保存的功能的警告),然后查看生成的 .txt 文件cat:
$ cat nbsp.txt
ABC DEFRun Code Online (Sandbox Code Playgroud)
然后再次用-v开关显示非打印字符
$ cat -v nbsp.txt
M-oM-;M-?ABCM-BM- DEFRun Code Online (Sandbox Code Playgroud)
注意,我们还得到了一个初始序列M-oM-;M-?或十六进制0xef 0xbb 0xbf,它是与命令 ie报告的文件类型一致的 UTF8字节顺序标记 (BOM)file
$ file nbsp.txt
nbsp.txt: UTF-8 Unicode (with BOM) textRun Code Online (Sandbox Code Playgroud)
使用od我们看到的字节顺序打印十六进制值
$ od -tx1 nbsp.txt
0000000 ef bb bf 41 42 43 c2 a0 44 45 46 0a
0000014Run Code Online (Sandbox Code Playgroud)
可以使用标准工具操作这些字符,例如sed或tr通过将十六进制代码指定为转义序列,例如用纯 ASCII 空格替换不间断空格
$ sed 's/\xc2\xa0/ /g' nbsp.txt
ABC DEFRun Code Online (Sandbox Code Playgroud)
再次检查od确认替换为普通的 ASCII 空格 0x20(十进制 32)
$ sed 's/\xc2\xa0/ /g' nbsp.txt | od -tx1
0000000 ef bb bf 41 42 43 20 44 45 46 0a
0000013Run Code Online (Sandbox Code Playgroud)
在 gnome-terminal(以及其他支持 UTF8 的终端模拟器)中,也可以直接使用键序列+ +后跟一个十六进制值然后是键 - 序列最初显示为 u?直接输入 unicode代码点值。 ?.?.? 但是当您点击例如我们可以做的相同的不间断空格替换时,角色应该组合CtrlShiftuEnterEnter
$ sed 's/Ctrl+Shift+ua0Run Code Online (Sandbox Code Playgroud)
显示为
$ sed 's/?/?u?a?0?
Run Code Online (Sandbox Code Playgroud)
然后完成为
$ sed 's/ / /g' nbsp.txt
ABC DEFRun Code Online (Sandbox Code Playgroud)
使用cat -v我们可以确认M-BM-序列已经变成了一个普通的空间
$ sed 's/ / /g' nbsp.txt | cat -v
M-oM-;M-?ABC DEFRun Code Online (Sandbox Code Playgroud)
您可能还想查看更通用的编码转换器,例如iconv和uconv。
经过尝试很多事情后,我终于找到了解决方案。要使用 sed 替换该奇怪的字符,您需要复制并粘贴包含其附近的奇怪空格的确切文本,然后将其直接粘贴到 sed 命令中:
\n\nsed -r 's:paste-here:<p>:g' -i file
在 sed 命令中看起来像这样:
\n\nsed -r 's:<p>\xc2\xa0:<p>:g' -i file
但无论如何它都会起作用。
\n