我正在处理一堆日志文件,我需要在其中执行搜索和替换操作。我在 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 的) 并将它们替换为 Foo。但是,它应该忽略第二列 000004a8 中的字符串(这些是线程 ID)。您可以假设线程 ID 始终以 00 开头,并且 ID 永远不会以 0 开头。此外,ID 的最小长度为 6。
这是我现在拥有的:
sed -i -- 's/^(?!00)[A-Z0-9]\{6,\}/foo/g' "sample.log"
但是,当我运行该命令时,它什么也没做。感谢您提供任何帮助。
谢谢
最佳答案
在您的尝试中,删除插入符 ^
(行首)并将其替换为单词边界 \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
关于regex - 使用正则表达式搜索和替换具有最小长度的字母数字字符串,同时忽略以特定字符开头的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42110434/