gpt4 book ai didi

grep 中的正则表达式用于包含 A、B、C...但不包含 Z 的文件

转载 作者:IT王子 更新时间:2023-10-29 01:26:43 26 4
gpt4 key购买 nike

我花了几个小时试图用这个问题的部分答案自己回答这个问题;因此,如果这个问题已经得到解答,我深表歉意,但结合我能找到的部分解决方案来正确执行此搜索似乎超出了我的能力范围。

我正在尝试做的事情:在一个目录中搜索以任何顺序在文件中的任何位置包含多个唯一字符串但不在文件中的任何位置包含另一个特定字符串的文件。 p>

这是我到目前为止的搜索:

pcregrep -riM '^(?=.*uniquestringA)(?=.*uniquestringB)(?=.*uniquestringC)(?=.*uniquestringD)(?=.*uniquestringE).*$' . 
| xargs grep -Li 'uniquestringZ'

我意识到这是非常非常错误的,因为我什至似乎无法在忽略字符串出现顺序的情况下进行多行搜索。

非常感谢任何帮助。

最佳答案

如果你的 grep 有前瞻性,你应该能够做到

^(?!.*Z)(?=.*A)(?=.*B)(?=.*C)(.*)$

See it work

使用这个文件:

$ cat /tmp/grep_tgt.txt
A,B,C # should match
A,B,C,D # should match
A,C,D # no match, lacking upper b
A,B,C,Z # no match, has upper z

你可以使用 perl one liner:

$ perl -ne 'print if /^(?!.*Z)(?=.*A)(?=.*B)(?=.*C)(.*)$/' /tmp/grep_tgt.txt
A,B,C # should match
A,B,C,D # should match

带文件名:

$ find . -type f
./.DS_Store
./A-B-C
./A-B-C-Z
./A-C-D
./sub/A-B-C-D

您可以使用 perl 过滤文件名:

$ find . -type f | perl -ne 'print if /^(?!.*Z)(?=.*A)(?=.*B)(?=.*C)(.*)$/'
./A-B-C
./sub/A-B-C-D

如果你想读取文件内容来测试模式(比如 grep),你可以这样做:

$ find . -type f | xargs perl -ne 'print "$ARGV: $&\n" if /^
(?!.*Z)(?=.*A)(?=.*B)(?=.*C)(.*)$/'
./1.txt: A B C # should match
./2.txt: A,B,C,D # should match

我将四个文件放在一个目录 (1.txt .. 4.txt) 中,其中 1.txt 和 2.txt 中的文本匹配。

关于grep 中的正则表达式用于包含 A、B、C...但不包含 Z 的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25021669/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com