用空格替换所有子弹

时间:2014-07-24 20:12:29

标签: bash

如何用空格替换项目符号(八进制值:225,十六进制值:95)? 我尝试了以下命令:

echo '•test' | tr '\225' ' '

echo '•test' | awk '{gsub(/\225/," ");print $0}'

echo '•test' | sed 's/\o225/ /g'

echo '•test' | LANG='' sed 's/\o225/ /g'

echo '•test' | sed 's/\x95/ /g'


上述命令不起作用。

2 个答案:

答案 0 :(得分:7)

让我们看看你目前的努力失败的原因:

$ echo '•test' | hexdump -C
00000000  e2 80 a2 74 65 73 74 0a                           |...test.|
00000008

这些项目符号实际上是三个字节 - e2 80 a2,而不是一个0x95

修正的sed表达式正常工作:

echo '•test' | sed -e 's/•/ /g'

...或(使用/bin/sh中没有的bash扩展语法)...

echo '•test' | sed -e  $'s@\xe2\x80\xa2@ @g'

...或(使用bash-builtin替换功能):

s='•test'             # original string in s
orig='•'              # item to replace
new=' '               # thing to replace it with
s2=${s//"$orig"/$new} # result in s2

...或(使用GNU sed扩展,根据@anubhava)...

echo '•test' | sed 's@\xe2\x80\xa2@ @g'

答案 1 :(得分:3)

作为Charles Duffy的优秀答案的补充,对应于字符项目符号的 bytes 可能会因使用的文件编码而有所不同。

例如, bullet 是:

  • 单字节0x95如果文件编码为(Windows)CP1252

  • 单字节0xa5如果文件编码为(传统)Macintosh Roman 编码

  • 如果文件编码为UTF-8

  • ,则为三个字节的序列

对于"一个字节编码",tr是一个很好的捕捉。至于我自己,我会偏爱略有不同的语法,但这应该有效:

sh$ tr $'\x95' ' ' < cp1252.txt 
 test

sh$ tr $'\xa5' ' ' < mac.txt 
 test

如果您的文件是UTF-8编码的......那么您已经有了答案!