如何用空格替换项目符号(八进制值: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'
上述命令不起作用。
答案 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编码的......那么您已经有了答案!