如何包围以 ! 开头的文本?直到 sed 中带有转义字符的行尾?
How do I surround text beginning with ! until end of line with escape characters in sed?
我想:
- 在
ESC E
行中以 !
字符开头的前缀文本(即 ESC
八进制代码 3
)
- 在行尾添加
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
我想:
- 在
ESC E
行中以!
字符开头的前缀文本(即ESC
八进制代码3
) - 在行尾添加
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