gpt4 book ai didi

regex - Mac OS X 上的 grep/ack 查找多个字符串和相关文件类型

转载 作者:行者123 更新时间:2023-11-29 09:46:52 24 4
gpt4 key购买 nike

我想在满足以下条件的 Mac OS X 上运行 grep:

  • 搜索所有以*.R*.r为扩展名的文件,忽略其他文件
  • 查找字符串:wordAwordB 说明字符串可能以 someRubbishWordARubbish 格式出现的事实(这是一个有效的匹配)
  • 只列出两个字符串都出现的文件,不考虑顺序
  • 打印字符串出现的行
  • 用颜色突出显示找到的单词
  • 将文件名打印为标题和标题下的行。我的灵感来自 ack选项。
  • 忽略大小写

方法

我正在考虑使用 this discussion并从以下 grep 语法开始:

grep --include=*.R -r setHeader .

然后将其与以下内容结合:

grep 'word1\|word2\|word3' /path

但是,对于确保正确评估上述所有标准的评论,我将不胜感激。

^(.*)(facet|map)(.*)(map|facet)(.*)$

regex101


确认

运行 ack -f 显示将搜索 *.R 文件,因此将接受使用 ack 的解决方案。例如,运行:

ack wordA --colour -i -H --rr

针对 wordA 获得所需的结果。我正在考虑将它与讨论的解决方案结合起来 here但我想使用 AND 而不是 OR 并忽略字符串可能出现的顺序。我进一步尝试:

ack --match wordA --match wordB  --colour -i -H --rr

但这只产生了 wordB 的结果。

最佳答案

下面是一个脚本,它结合了名称接近的 awkack 命令:

find . -iname '*.r' | while read file; do
awk '
BEGIN { IGNORECASE=1; sawWordA = 0; sawWordB = 0 }
/wordA/ { sawWordA = 1 }
/wordB/ { sawWordB = 1 }
sawWordA && sawWordB { exit } # stop reading lines if both matches seen
END { exit !(sawWordA && sawWordB) }
' \
"${file}" \
&& ack --nofilter -H -i 'wordA|wordB' "${file}"
done

awk 命令...

  • 不考虑顺序只列出两个字符串都出现的文件
  • 忽略大小写

...和 ​​ack 命令...

  • 打印字符串出现的行
  • 用颜色突出显示找到的单词
  • 根据 ack 选项将文件名打印为标题和标题下的行
  • 忽略大小写

如果有搜索字符串匹配,awk 脚本会设置标志。如果两个字符串都匹配,则片段 exit !(sawWordA && sawWordB) 将返回 0。如果 awk 返回 0,则 ack 命令运行。

ack --nofilter 选项告诉 ack 避免从 STDIN 读取。否则,ack 将尝试使用 read 命令正在使用的 STDIN。

在评论中,Konrad 询问在 shell 脚本中传入变量时如何使用上述代码。下面是一个例子:

#!/bin/sh

if [ $# -ne 2 ]; then
echo Usage: $0 {string1} {string2}
E_BADARGS=65
exit $E_BADARGS
fi

find . -maxdepth 1 -iname '*.r' | while read file; do
awk "
BEGIN { IGNORECASE=1; sawArg1 = 0; sawArg2 = 0 }
/$1/ { sawArg1 = 1 }
/$2/ { sawArg2 = 1 }
sawArg1 && sawArg2 { exit } # stop reading lines if both matches seen
END { exit !(sawArg1 && sawArg2) }
" \
"${file}" \
&& ack --nofilter -H -i "$1|$2" "${file}"
done

上面的例子没有对提供给脚本的参数中的任何特殊字符进行转义。如果需要转义,可以根据需要修改脚本。

关于regex - Mac OS X 上的 grep/ack 查找多个字符串和相关文件类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35276374/

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