是否有支持 unicode 的 sed 替代方案?

A-l*_*bby 40 sed unicode hexdump

例如:

sed 's/\u0091//g' file1
Run Code Online (Sandbox Code Playgroud)

现在,我必须做得到hexdump十六进制数并输入sed如下:

$ echo -ne '\u9991' | hexdump -C
00000000  e9 a6 91                                          |...|
00000003
Run Code Online (Sandbox Code Playgroud)

进而:

$ sed 's/\xe9\xa6\x91//g' file1
Run Code Online (Sandbox Code Playgroud)

cha*_*aos 34

只需使用该语法:

sed 's/?//g' file1
Run Code Online (Sandbox Code Playgroud)

或者以转义形式:

sed "s/$(echo -ne '\u9991')//g" file1
Run Code Online (Sandbox Code Playgroud)

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

  • @chaos:它适用于`en_US.UTF-8`,但不适用于`C`。 (4认同)

cho*_*oba 18

Perl 可以做到:

echo ??“?”?????? | perl -CS -pe 's/\N{U+9991}/Jin/g'
Run Code Online (Sandbox Code Playgroud)

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

  • Perl 几乎可以做任何事情..... (9认同)

The*_*est 7

许多版本sed支持 Unicode

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

  • UTF-16 在基于 Unix 的操作系统中非常不可用。这也是一种本不该见天日的可憎之物。 (12认同)

Ary*_*rog 6

这对我有用:

\n\n
$ vim -nEs +'%s/\\%u9991//g' +wq file1\n
Run Code Online (Sandbox Code Playgroud)\n\n

它\xe2\x80\x99s 比 I\xe2\x80\x99d 更冗长;这里\xe2\x80\x99s 完整的解释:

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


Dav*_*ove 6

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

$ echo "????" | sed s/$'\u9991'//g
???
Run Code Online (Sandbox Code Playgroud)

  • 这应该是新接受的答案,简单干净! (2认同)
  • @AllenWang 作为参考,“$'...'”类型的引号来自 1993 年的 ksh93,而其中的“\uxxxx”来自 2003 年的 zsh(受到 GNU“printf”的启发)。在 2010 年的 4.2 中添加到 bash 中。所以除非你使用的是 3.2 版本的 macOS,否则这个答案在 2015 年提出这个问题时也是有效的。 (2认同)