作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我花了几个小时试图用这个问题的部分答案自己回答这个问题;因此,如果这个问题已经得到解答,我深表歉意,但结合我能找到的部分解决方案来正确执行此搜索似乎超出了我的能力范围。
我正在尝试做的事情:在一个目录中搜索以任何顺序在文件中的任何位置包含多个唯一字符串但不在文件中的任何位置包含另一个特定字符串的文件。 p>
这是我到目前为止的搜索:
pcregrep -riM '^(?=.*uniquestringA)(?=.*uniquestringB)(?=.*uniquestringC)(?=.*uniquestringD)(?=.*uniquestringE).*$' .
| xargs grep -Li 'uniquestringZ'
我意识到这是非常非常错误的,因为我什至似乎无法在忽略字符串出现顺序的情况下进行多行搜索。
非常感谢任何帮助。
最佳答案
如果你的 grep 有前瞻性,你应该能够做到
^(?!.*Z)(?=.*A)(?=.*B)(?=.*C)(.*)$
使用这个文件:
$ 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/
我是一名优秀的程序员,十分优秀!