大家好:我遇到了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完成。
答案 0 :(得分:1)
答案 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的024
是0x14
)
基于上面的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
的旧版本。