BASH:替换特殊字符组

时间:2013-07-25 10:35:48

标签: oracle bash replace special-characters

我有一个相当棘手的请求......

我们使用连接到oracle数据库的特殊应用程序。出于控制原因,应用程序使用由应用程序定义并保存在数据库的长字段中的特殊字符。

我的任务是定期查询长字段并检查更改。为此,我使用文件中的bash脚本编写内容,并将旧文件和新文件与md5sum进行比较。

如果有区别,我想通过邮件发送旧文件。问题是,旧文件包含这些特殊字符,我不知道如何用例如描述它们的字符串替换它们。

我试图根据他们的ASCII代码替换它们,但这不起作用。我也尝试用它们在文件中的外观来替换它们。 (它们看起来像这样:^ P)这也不起作用。

当通过像nano这样的文本编辑器查看文件时,字符如上所述是可见的。但是当在文件上使用cat时,内容仅在第一次出现这样的控制字符时显示。

据我所知,由于内容在LONG字段中,因此有可能在从数据库查询时替换它们。

我希望你能帮助我。

提前谢谢。

3 个答案:

答案 0 :(得分:2)

^P是Control-P字符,它是十进制16或十六进制0x10,也称为ASCII中的数据链接转义(DLE)字符。

要用另一个字符串替换文件中出现的所有0x10,我们可以使用我们的朋友gsed

gsed "s/\x10/Data Link Escape/g" yourfile.txt

这应该用文本字符串“Data Link Escape”替换所有包含十六进制值0x10的字符。你可能想要使用不同的字符串 - 这只是一个例子。

如果您的sed版本识别出sed单字符转义码,则可能会使用标准\xNN命令,具体取决于您使用的系统。如果您需要替换多个十六进制字符,则可能需要创建一个包含sed命令的文件,每个命令需要替换一个十六进制字符,并告诉sedgsed使用文件中的命令 - 请参阅sedgsed手册页以了解如何执行此操作。

分享并享受。

答案 1 :(得分:1)

您可以使用xxd将字符串更改为其十六进制表示形式,然后使用xxd -r转换回来。

或者,您可以使用uuencodeuudecode

答案 2 :(得分:1)

一种选择是通过cat -v运行文件。这会将非打印字符替换为可见的表示形式(对控制字符使用^表示法):

$ echo $'\x10\x12\x13\x14\x16' | cat -v
^P^R^S^T^V