如何包围以 ! 开头的文本?直到 sed 中带有转义字符的行尾?

How do I surround text beginning with ! until end of line with escape characters in sed?

我想:

  1. ESC E 行中以 ! 字符开头的前缀文本(即 ESC 八进制代码 3
  2. 在行尾添加 ESC F 后缀。

这是我试过的:

sed $'s/\(!.*\)/3E3F/'

这是我得到的错误:

$ echo "test line     ! This part shall be enclosed with ESC commands" | sed $'s/\(!.*\)/3E3F/'
sh: Syntax error: Bad escape sequence

如果我删除 $ 符号,可以看到文本被检测并包含在内,但是 sed 无法插入 ESC 字符。

$ echo "test line     ! This part shall be enclosed with ESC commands" | sed 's/\(!.*\)/3E3F/'
test line     033E! This part shall be enclosed with ESC commands033F

我正在使用 FreeBSD 12 sed,根据手册页,它应该是 IEEE Std 1003.2 POSIC.2 规范的超集。

只为需要的部分申请$'..'

$ s='test line     ! This part shall be enclosed with ESC commands'
$ echo "$s" | sed 's/\(!.*\)/'$'3''E'$'3F''/' | cat -v
test line     ^[E! This part shall be enclosed with ESC commands^[F

不确定其他版本,但在 GNU sed 上,您可以使用十六进制 \xHH 和八进制 \oNNN(注意 o)直接转义,因此您可以做:

$ echo "$s" | sed 's/\(!.*\)/\x1BE\x1BF/' | cat -v
test line     ^[E! This part shall be enclosed with ESC commands^[F

$ echo "$s" | sed 's/\(!.*\)/\o033E\o033F/' | cat -v
test line     ^[E! This part shall be enclosed with ESC commands^[F