您使用的模式不是您认为的模式:\024
仅被评估为字符串“024”。如果你看看@Alex发布的sed escapes references,\0
没有特别的处理,所以\0
变成简单的“0”,当然24
仍然是“24”。例如:
$ echo hello 024 joe | sed 's/\024/^T/g'
hello joe
所以,既然你想与八进制值024
替换的字符,你必须使用的八进制值正确的格式,如@Alex已经写:
cat input3 | sed 's/\o024/^T/g'
你可以使用六值过,如果这是更容易:
cat input3 | sed 's/\x14/^T/g'
(这不是一个错字,024
转化为六是0x14
)
基于以上sed的参考,还有一个更可读的版本:
cat input3 | sed 's/\ct/^T/g'
也就是说,你可以使用\c
匹配控制 - X其中X是任意字符。这在您的示例输入中适用于Control-T,Control-R,Control-_,但它不适用于Control-ESCAPE,因为ESCAPE没有ASCII字符(并且\c[
不起作用)。为此,您确实需要使用Control-ESCAPE的八进制或六进制表示。
额外提示:您可以使用hexdump
找到你输入的六代码,例如:
$ hexdump -C input3
00000000 3a 43 6f 6e 74 72 6f 6c 2d 52 3a 12 0a 3a 45 73 |:Control-R:..:Es|
00000010 63 61 70 65 3a 1b 0a 3a 43 6f 6e 74 72 6f 6c 2d |cape:..:Control-|
00000020 54 3a 14 0a 3a 43 6f 6e 74 72 6f 6c 2d 5f 3a 1f |T:..:Control-_:.|
00000030 0a
所以,更换控制,ESCAPE:
cat input3 | sed 's/\x1b/^[/'
最后,来替代多个有一个sed
命令的模式,您需要将s///
命令除以;
或使用多个-e
标志,例如这两个标志都可以工作:
cat input3 | sed 's/\ct/^T/;s/\cr/^R/'
cat input3 | sed -e 's/\ct/^T/' -e 's/\cr/^R/'
使用多个-e
更便携,因为它也适用于旧版本的sed
。
我希望你的'^ T'是你按下键的结果,而不是输入2个单独的字符,'^'和'T',后者将不起作用。祝你好运! –
shellter
它必须由两个独立的字符^和T.哈尔替换。谢谢,但告诉我它不起作用。我必须为sed阅读更多的手册页,然后环顾网络。 :D – TwilightSparkleTheGeek
对不起,应该早些说过,可以用键或按Ctrl-T(按住Control键并按T)来产生'^ T'。祝你好运。 –
shellter