sed是否有替代方法支持unicode?


33

例如:

sed 's/\u0091//g' file1

现在,我要做的hexdump是获取十六进制数并输入sed如下:

$ echo -ne '\u9991' | hexdump -C
00000000  e9 a6 91                                          |...|
00000003

然后:

$ sed 's/\xe9\xa6\x91//g' file1

Answers:


28

只需使用以下语法:

sed 's/馑//g' file1

或以转义形式:

sed "s/$(echo -ne '\u9991')//g" file1

(请注意,较早版本的Bash和某些Shell无法理解echo -e '\u9991',因此请首先检查。)


1
sed将count算作一个字符还是3?也就是说,echo 馑 | sed s/...//打印什么吗?
user253751

@immibis由于sed具有g修饰符,因此它们在彼此跟随时也替换了所有出现的情况。sed也应将其视为一个字符,请参见:echo -ne "馑" | wc -m1。如果计算字节数(wc -c),它将返回3。我是否正确理解您的问题?
混乱

我的意思是:是.指“一个字符”还是“一个字节”?
user253751

@immibis我匹配一个字符,因此echo 馑 | sed s/...//给了我(什么都替换不了)
混乱

4
@chaos:它可以在下运行en_US.UTF-8,但不能在下运行C
choroba

15

Perl可以做到:

echo 汉典“馑”字的基本解释 | perl -CS -pe 's/\N{U+9991}/Jin/g'

-CS 为标准输入,输出和错误打开UTF-8。


7
Perl几乎可以做任何事情.....
wobbily_col 2015年

6

sed支持Unicode的多个版本

  • 传家宝sed,它基于“原始Unix资料”。
  • GNU sed,这是它自己的代码库。
  • Plan 9 sed,已移植到类似Unix的操作系统上。

我找不到有关BSD sed的信息,我认为这很奇怪,但我认为它也支持Unicode的可能性很大。不幸的是,没有标准的方法可以告诉您sed要使用哪种编码,因此每个编码都有自己的方式。


他们支持带或不带BOM的UTF-16吗?
Bon Ami 2015年

10
UTF-16在基于Unix的操作系统中几乎无法使用。这也是可憎的事情,应该从未见过。
布莱恩·毕

它们是否支持UTF-16取决于实现,而且恐怕我没有这些数据。我怀疑Plan 9 sed是否可以使用(原始操作系统到处都是UTF-8),但是我不确定,即使不是,其他人也可能会使用。
2015年

2

这对我有用:

$ vim -nEs +'%s/\%u9991//g' +wq file1

这比我想要的更冗长。这是完整的解释:

  • -n 禁用vim交换文件
  • -E 改进模式
  • -s 静音模式
  • +'%s/\%u9991//g' 执行替代命令
  • +wq 保存并退出

我想这是file1 就地修改的,对吗?
Gerrit

@gerrit是正确的,并感谢您指出。
Aryeh Leib Taurog

1

对于最新版本的BASH,只需省略sed表达式周围的引号即可使用BASH的转义字符串。sed表达式中或sed表达式的一部分中的空间(可能被BASH解释为通配符)可以单独引用。

$ echo "饥馑荐臻" | sed s/$'\u9991'//g
饥荐臻

这应该是新接受的答案,简单而干净!
艾伦·王

0

适用于我的GNU sed(4.2.1版):

$ echo -ne $'\u9991' | sed 's/\xe9\xa6\x91//g' | hexdump -C
$ echo -ne $'\u9991' | hexdump -C
00000000  e9 a6 91

(作为另一个替代品,sed您也可以使用GNU awk;但这似乎没有必要。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.