为什么 sed 对非 ASCII 字节的替换不起作用?

为什么 sed 对非 ASCII 字节的替换不起作用?

我在 OS X(通过 Homebrew 安装的 4.2.2)上尝试使用 GNU sed 进行替换。但这不起作用。

printf "Hello\x92 World" | gsed -r "s/[\x92]/'/g"

预期输出是:

Hello' World

实际输出是:

Hello<unknown character symbol> World

我也尝试过:

printf "\x92" | gsed -r 's/[\x92]/P/g'

但我继续得到一个不可打印的字符,即字节“\x92”。

我在这里做错了什么?

答案1

我刚刚sed彻底检查了 的信息页面 ( info sed) 并用各种方法做了相当多的实验。

我的结论:您无法将 代表的字符\x92放入字符类中。

但是,您可以|改为使用。

以下是一些演示:

$ printf "a\x92\n"
a?
$ printf "a\x92\n" | sed 's/[a\x92]/P/g'
P?
$ printf "a\x92\n" | sed 's/[a\\x92]/P/g'
P?
$ printf "a\x92\n" | sed 's/[a'$'\x92'']/P/g'
P?
$ printf "a\x92\n" | sed 's/[a'"$(printf '\x92')"']/P/g'
P?
$ printf "a\x92\n" | sed 's/[a[\x92]]/P/g'
a?
$ printf "a\x92\n" | sed 's/a\|\x92/P/g'
PP
$ printf "a\x92\n" | sed -r 's/a|\x92/P/g'
PP
$ 

相关内容