使用正则表达式搜索并替换具有最小长度的字母数字字符串,同时忽略以特定字符开头的字符串

时间:2017-02-08 10:22:20

标签: regex linux

我正在处理一堆日志文件,我需要在其中执行搜索和替换操作。我正在研究一个linux系统。

这是我的数据,我保存为.log文件:

[12/21/16 10:59:58:378 GMT+05:30] 000022a8 Err     R profile.getId() PATADJO
[12/21/16 10:59:58:378 GMT+05:30] 000022a8 Err     R profile.getId() PTASDAS
[12/21/16 10:59:58:612 GMT+05:30] 00000104 Err     R profile.getId() MA2SD3ADA
[12/21/16 11:00:01:346 GMT+05:30] 000004a8 Err     R profile.getId() D04S4514
[12/21/16 11:00:10:841 GMT+05:30] 00000187 Err     R You have been registered successfully. Your ID is 1234567.
[12/21/16 11:00:01:346 GMT+05:30] 000004a8 Err     R profile.getId() BFDS343SDF
[12/21/16 11:00:10:841 GMT+05:30] 00000187 Err     R You have been registered successfully. Your ID is 1234567.

我的目标是搜索 BFDS343SDF 等字母数字字符串,只搜索 PATADJO 等字母字符串,只搜索 1234567 等数字字符串(均为ID's) )并用 Foo 替换它们。但是,它应该忽略第二列 000004a8 中的字符串(这些是线程ID)。您可以假设线程ID始终以00开头,并且ID永远不会从0开始。此外,ID的最小长度为6.

这就是我现在所拥有的:

sed -i -- 's/^(?!00)[A-Z0-9]\{6,\}/foo/g' "sample.log"

但是,当我运行命令时,它什么也没做。任何帮助表示赞赏。

由于

1 个答案:

答案 0 :(得分:0)

在您的尝试中,移除carret ^(行首)并将其替换为单词边界\b

使用perl:

perl -api.back -e 's/\b(?!00)[A-Z0-9]{6,}/foo/g' sample.log

原始文件另存为sample.log.back

如果您不想保存原始文件:

perl -apie 's/\b(?!00)[A-Z0-9]{6,}/foo/g' sample.log