0

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

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

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

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

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

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

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

我希望你能帮助我。

先感谢您。

马可

4

3 回答 3

2

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

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

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

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

根据您使用的系统,如果您的版本识别单字符转义码,则可以使用标准sed命令。如果您需要替换多个十六进制字符,您可能需要创建一个包含命令的文件,每个十六进制字符对应一个您需要替换的命令,并告诉或使用文件中的命令 - 请参阅手册页以了解如何做这个。sed\xNNsedsedgsedsedgsed

分享和享受。

于 2013-07-25T11:43:44.517 回答
1

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

或者,您可以使用uuencodeuudecode

于 2013-07-25T10:40:25.737 回答
1

一种选择是通过cat -v. 这将非打印字符替换为可见表示(使用^控制字符的表示法):

$ echo $'\x10\x12\x13\x14\x16' | cat -v
^P^R^S^T^V
于 2013-07-25T14:19:01.783 回答