Bash 将所有项目符号替换为空格

Bash 将所有项目符号替换为空格,bash,Bash,如何将项目符号(八进制值:225,十六进制值:95)替换为空格? 我尝试了以下命令: 上述命令不起作用。让我们看看您当前努力失败的原因: $ echo '•test' | hexdump -C 00000000 e2 80 a2 74 65 73 74 0a |...test.| 00000008 这些项目符号实际上是三个字节--e280a2,而不是一个0x95 正确的sed表达式可以正常工作: echo '•test' | sed -

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



上述命令不起作用。

让我们看看您当前努力失败的原因:

$ echo '•test' | hexdump -C
00000000  e2 80 a2 74 65 73 74 0a                           |...test.|
00000008
这些项目符号实际上是三个字节--
e280a2
,而不是一个
0x95

正确的sed表达式可以正常工作:

echo '•test' | sed -e 's/•/ /g'
…或(使用
/bin/sh
中不可用的bash扩展语法)

…或(使用bash内置替换功能):

…或(使用GNU-sed扩展,按照@anubhava)


作为Charles Duffy优秀答案的补充,根据所使用的文件编码,与字符项目符号对应的字节可能会有所不同

例如,项目符号是:

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

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

  • 如果文件编码为UTF-8,则为三个字节的序列


对于“单字节编码”
tr
是一个很好的例子。就我自己而言,我倾向于使用稍微不同的语法,但这应该是可行的:

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

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

如果您的文件是UTF-8编码的。。。你已经有答案了

或者:
echo'•test'| sed's/\xe2\x80\xa2/'
为什么使用at符号(@)?我使用以下命令进行了测试:echo“•test”| sed's/\xe2\x80\xa2//g”。它是有效的。@user2874781,我习惯使用
@
,因为
/
经常存在于被替换的内容中,这使得它成为一个糟糕的信号选择。在这个特殊的例子中,两者都不存在,所以这两种方式都没有特别的区别。(在许多情况下,需要选择一个不能在数据中的符号,这使得
sed
工具的选择非常糟糕)。@SylvainLeroux,我坚信StackOverflow是一个字节一个字节地代表他们的原始内容,并查看了他们复制和粘贴的内容。@anubhava:并非所有的
sed
实现都支持
\xnn
转义-例如,可以与GNU-sed一起使用,但不能与BSD/OSX
sed
一起使用。POSIX
sed
仅支持基本正则表达式,根据该正则表达式,序列
\x
未定义-参见+1:我没有查找
0x95
假设来自哪个编码,但它是有用的背景。
echo '•test' | sed -e  $'s@\xe2\x80\xa2@ @g'
s='•test'             # original string in s
orig='•'              # item to replace
new=' '               # thing to replace it with
s2=${s//"$orig"/$new} # result in s2
echo '•test' | sed 's@\xe2\x80\xa2@ @g'
sh$ tr $'\x95' ' ' < cp1252.txt 
 test

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