使用sed用vi编辑器代码替换非printables

时间:2013-11-15 19:37:28

标签: regex sed csh

大家好:我遇到了sed程序的问题

问题:

我是一名刚刚学习Unix的CS学生,我的任务是用他们的Vi编辑器等效表示法将非打印字符\x00替换为\x1F NUL到US。例如,哪里有BEL字符(\ x07)我用^ G替换它。

我必须转换的文件(称为input3)包含以下内容:

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

我的老师把非印刷品放在冒号的两边。我的解决方案必须使用Unix Utilities,特别是sed。

我的解决方案:

所以我使用以下sed命令为启动器的Control-T人做了这样的任务:

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

但它不起作用它只是将相同的文件发送到标准输出。我的sed命令有问题吗?我的语言环境是POSIX,我正在使用C-shell。这必须使用C-shell完成。

2 个答案:

答案 0 :(得分:1)

我认为你错过了转义八进制值024

请改为尝试:

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

您可能会发现此sed escapes reference有用。

答案 1 :(得分: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'

如果更容易,也可以使用hexa值:

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

(这不是拼写错误,转换为hexa的0240x14

基于上面的sed参考,有一个更易读的版本:

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

也就是说,您可以使用\c来匹配Control- X ,其中 X 是任何字符。这对于示例输入中的Control-T,Control-R,Control-_很有效,但它不适用于Control-ESCAPE,因为ESCAPE没有ASCII字符(并且\c[不起作用)。为此,您确实需要使用Control-ESCAPE的八进制或六进制表示。

额外提示:您可以使用hexdump查找输入的hexa代码,例如:

$ 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  

所以,要替换Control-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的旧版本。