У меня есть большие файлы, содержащие строки с парами ключ=значение, разделенными запятыми. Например:
DATE=2024/08/19,TIME=09:15:51,ID=9,PID=49,ERR=12,RCA=52
DATE=2024/08/19,TIME=10:28:40,ID=10,PID=50,ERR=,RCA=52
DATE=2024/08/19,TIME=10:28:42,ID=11,PID=51,ERR=4,RCA=52
У меня есть grep, который извлекает интересующие меня ключевые значения:
grep -oP '(DATE|ID|ERR)=[^,]*' files-*.txt
Результат, который мне нужен:
DATE=2024/08/19
ID=9
ERR=12
DATE=2024/08/19
ID=10
ERR=
DATE=2024/08/19
ID=11
ERR=4
Но мой grep также включает в результаты PID (минус P):
DATE=2024/08/19
ID=9
ID=49
ERR=12
DATE=2024/08/19
ID=10
ID=50
ERR=
DATE=2024/08/19
ID=11
ID=51
ERR=4
Как я могу изменить grep, чтобы он возвращал ключ и значение идентификатора, но не ключ и значение PID?
Любая помощь, которую вы можете оказать, будет очень признательна





Вам следует использовать границу слова (\b), чтобы избежать совпадения PID:
$ grep -oP '(DATE|\bID|ERR)=[^,]*' files-*.txt
Используйте утверждение нулевой ширины либо границу слова \b, поскольку запятая не является символом слова, либо положительный взгляд назад (?<=pattern), что является более общим подходом:
$ grep -oP '(?<=^|,)(DATE|ID|ERR)=[^,]*' files-*.txt
DATE=2024/08/19
ID=9
ERR=12
DATE=2024/08/19
ID=10
ERR=
DATE=2024/08/19
ID=11
ERR=4
Это отличный пример пословицы о том, что у программиста, который использует регулярные выражения для решения проблемы, теперь возникают две проблемы.