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

标签 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 的) 并将它们替换为 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/

相关文章:

regex - 删除文本文件中的所有超链接,linux脚本

javascript - 正则表达式匹配两个相同字符串之间的所有字符串

带有一些附加条件的 Javascript REGEX : To allow ONLY specific characters,?

php - 无法打开位于 "/etc/sw/keys"的存储库

linux - Makefile、可执行文件和目标文件位于不同的目录中

regex - 使用正则表达式获取命令列表

c# - 删除 4 字节的 UTF8 字符

c - 将 UART 数据重定向到 pcie 端口

c++ - GDB 找不到源文件

c - 使用硬件性能计数器是个好主意