我想使用sed
的音译 ( y///
) 将一组字符替换为另一组字符。
我希望这与使用该程序一样有效tr
。
$ echo '[]{}abc' | tr '[ab}' 'gefh'
g]{hefc
Run Code Online (Sandbox Code Playgroud)
但是,当我使用 sed 执行相同的操作时,我看到以下错误:
$ echo '[]{}abc' | sed 'y/[ab}/gefh/'
sed: 1: "y/[ab}/gefh/": unbalanced brackets ([])
Run Code Online (Sandbox Code Playgroud)
这是有道理的,因为我预计需要转义该[
角色。但是,当我尝试逃避这种情况时,我收到以下不同的错误:
$ echo '[]{}abc' | sed 'y/\[ab}/gefh/'
sed: 1: "y/\[ab}/gefh/": transform strings are not the same length
Run Code Online (Sandbox Code Playgroud)
我当前的解决方法是(1)仅使用tr
或(2)在音译的右侧插入一个“虚拟字符”,其作用除了匹配转义字符之外什么也不做。
$ echo '[]{}abc' | sed 'y/\[ab}/_gefh/'
g]{hefc
Run Code Online (Sandbox Code Playgroud)
然而,这并不令人满意且值得怀疑。它也不是很安全,例如当\
位于输入字符串中时。
$ echo '[]{}abc\' | sed 'y/\[ab}/_gefh/'
g]{hefc_
Run Code Online (Sandbox Code Playgroud)
在 sed 音译中转义字符而不将转义字符本身视为翻译的一部分的正确方法是什么?