Bash 将所有项目符号替换为空格
如何将项目符号(八进制值:225,十六进制值:95)替换为空格?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 -
我尝试了以下命令:
上述命令不起作用。让我们看看您当前努力失败的原因:
$ 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/OSXsed
一起使用。POSIXsed
仅支持基本正则表达式,根据该正则表达式,序列\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