2013-11-15 16 views
3

大家好:我有与SED程序的问题更换非printables他们vi编辑器的代码中使用的sed

问题:

我是一个CS的学生刚学的Unix和我已经已经被委托用它们的Vi编辑器等效符号替换非打印字符\x00\x1F NUL。例如,如果有一个BEL字符(\ x07),我用^ G替换它。

文件(称为输入3)我必须转换包含以下内容:

:Control-R: 
:Escape: 
:Control-T: 
:Control-_: 

我的老师发生在冒号两侧的非printables。我的解决方案必须使用Unix Utilities,特别是sed。

我的解决方案:

所以我用下面的sed命令做只是为了控制-T家伙对于初学者这样一个任务:

cat input3 | sed 's/\024/^T/g' 

但它不工作只是发相同的文件到标准输出。我的sed命令有问题吗?我的区域设置是POSIX,我正在使用C-shell。这必须使用C-shell来完成。

+0

我希望你的'^ T'是你按下键的结果,而不是输入2个单独的字符,'^'和'T',后者将不起作用。祝你好运! – shellter

+0

它必须由两个独立的字符^和T.哈尔替换。谢谢,但告诉我它不起作用。我必须为sed阅读更多的手册页,然后环顾网络。 :D – TwilightSparkleTheGeek

+0

对不起,应该早些说过,可以用键或按Ctrl-T(按住Control键并按T)来产生'^ T'。祝你好运。 – shellter

回答

1

您使用的模式不是您认为的模式:\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

+0

谢谢你的帮助。当我有机会时,我会确保稍后尝试你的命令。我还得到了一个Java项目。感谢您的帮助,janos。 – TwilightSparkleTheGeek

+0

谢谢janos!我能够得到它的工作。非常感谢! – TwilightSparkleTheGeek

1

我想你是错过了八进制值024

试试这个:

cat input3 | sed 's/\o024/^T/g' 

你会发现这个sed escapes reference有用。