Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用sed或tr unix命令使用Unicode代码或十六进制替换重音字符或特殊字符_Unix_Unicode_Replace_Sed - Fatal编程技术网

使用sed或tr unix命令使用Unicode代码或十六进制替换重音字符或特殊字符

使用sed或tr unix命令使用Unicode代码或十六进制替换重音字符或特殊字符,unix,unicode,replace,sed,Unix,Unicode,Replace,Sed,我想知道是否可以使用中找到的字符集来替换使用sed或tr的重音字符或特殊字符 我有一个使用sed命令的脚本。有时它不起作用:( 事情是这样的: sed -e "s/\"//g" \ -e "s/\'//g" \ -e "s/[$]/S/g" \ -e "s/%//g" \ -e "s/&/E/g" \ -e "s/@/a/g" \

我想知道是否可以使用中找到的字符集来替换使用sed或tr的重音字符或特殊字符

我有一个使用sed命令的脚本。有时它不起作用:(

事情是这样的:

sed -e "s/\"//g" \
                -e "s/\'//g" \
                -e "s/[$]/S/g" \
                -e "s/%//g" \
                -e "s/&/E/g" \
                -e "s/@/a/g" \
                -e "s/\^//g" \
                -e "s/\`//g" \
                -e "s/|//g" \
                -e "s/~//g" \
                -e "s/¡/i/g" \
                -e "s/¨//g" \
                -e "s/\´//g" \
                -e "s/¢/c/g" \
                -e "s/£//g" \
                -e "s/§//g" \
                -e "s/¬//g" \
                -e "s/°/o/g" \
                -e "s/·/./g" \
                -e "s/¹/1/g" \
                -e "s/²/2/g" \
                -e "s/³/3/g" \
                -e "s/¿//g" \
                -e "s/ª/a/g" \
                -e "s/à/a/g" \
                -e "s/á/a/g" \
                -e "s/â/a/g" \
                -e "s/ã/a/g" \
                -e "s/ä/a/g" \
                -e "s/å/a/g" \
                -e "s/æ/ae/g" \
操作系统,我在想,如果我在sed中使用十六进制或八进制unicode代码,它会工作。但我不知道如何

e.g. echo ¢ | sed 's/\x{00A2}/cent/g'
我感谢你的帮助。

你的剧本 …对我来说很好。每个替换都按预期执行,除了一个:

-e "s/\'//g" \
应该是

-e "s/'//g" \
(无需转义单引号,表达式位于双引号之间。)

应用于包含

"'$%&@^`|~¡¨´¢£§¬°·¹²³¿ªàáâãäåæ
它输出:

  S E a   i  c   o.123 aaaaaaaae
(没有空格。我添加它们是为了更容易比较原始模式和替换。)

六边形码 要替换为十六进制代码,请使用以下语法:

echo ¢ | sed 's/\xC2\xA2/cent/g'
为什么会这样?一个十六进制值
XX
被赋予sed,并带有
\xXX
语法(请参见
info-sed
)。对于您的
字符,您链接的网页上表格的第三列给出了
0xc2 0xa2

编码
当您试图替换UTF-8编码字符时,我假设您的文件使用UTF-8编码。如果不是,一个快速的解决方案是将其(或其副本)转换为UTF-8(例如,使用您最喜欢的文本编辑器).

有时它不起作用->如果它与某些情况有关,您能详细说明哪些情况导致它失败吗?对于第二个问题:尝试
echo | sed's/\xC2\xA2/cent/g'
,对我有效。谢谢@qole,但它对我无效。我使用的是aix btw。如果我尝试替换的文件不是在UTF-8 w中创建的,我的sed命令将不起作用/o BOM格式文件。至少我观察到了这一点。这是你应该明确的。你不能先将文件(或其副本)重新编码到UTF-8中吗?如果你不知道如何获取Unicode字符的十六进制值,那么GNU
echo
可以帮助:
echo-ne'\u00A0'| xxd