Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 多个grep到1个grep?我应该改变它吗?我该怎么做?_Regex_Linux_Find - Fatal编程技术网

Regex 多个grep到1个grep?我应该改变它吗?我该怎么做?

Regex 多个grep到1个grep?我应该改变它吗?我该怎么做?,regex,linux,find,Regex,Linux,Find,这是我最后的剧本 find -regex "^\..*[^(~$|\.o$|\.exe)]" | grep -v "\.svn" | grep -v ".tab." | grep -v ".yy." | xargs svn add 2>/dev/null 对于测试,我不想将其添加到svn,所以我使用 find -regex "^\..*[^(~$|\.o$|\.exe)]" | grep -v "\.svn" | grep -v ".tab." | grep -v ".yy." 注

这是我最后的剧本

find -regex "^\..*[^(~$|\.o$|\.exe)]" | grep -v "\.svn" | grep -v ".tab." | grep  -v ".yy." | xargs svn add 2>/dev/null
对于测试,我不想将其添加到svn,所以我使用

find -regex "^\..*[^(~$|\.o$|\.exe)]" | grep -v "\.svn" | grep -v ".tab." | grep  -v ".yy."
注意:我想忽略当前文件夹和子文件夹中以“.”开头的文件,但不知道如何选择.svn

我试图删除多余的grep以生成一个正则表达式,但就我的一生而言,我无法让它忽略当前文件夹和子文件夹中的.svn或.FILE,也无法让它忽略.tab。或者。yy

一个问题是我不知道怎么做。忽略是否从开始?工作我确信一个问题是我确实这样做了。*这将忽略我的.tab。规则,我不知道如何处理。

您可以通过-prune命令find忽略某些文件夹及其内容。这里不需要正则表达式,其他find命令就足够了。如果您希望能够处理带有空格的文件名,我将进一步使用-print0。总之,这应该满足您的需要:

find . \( -name ".*" -prune \) -or \
    -name "*.exe" -or -name "*.o" -or -name "*~" \
    -print0 | xargs -0 svn add
您可以使用-prune命令find忽略某些文件夹及其内容。这里不需要正则表达式,其他find命令就足够了。如果您希望能够处理带有空格的文件名,我将进一步使用-print0。总之,这应该满足您的需要:

find . \( -name ".*" -prune \) -or \
    -name "*.exe" -or -name "*.o" -or -name "*~" \
    -print0 | xargs -0 svn add

我不是100%确定您想要实现什么,但是find-regex'^.*/[^.].*.'应该可以匹配名称开头的任何非点字符。

我不是100%确定您想要实现什么,但是find-regex'^.*/[^.].*'应该可以匹配名称开头的任何非点字符

注意:我想忽略当前文件夹和子文件夹中以“.”开头的文件,但不知道如何选择.svn

一个问题是我不知道怎么做。忽略是否从开始?工作我确信一个问题是我确实这样做了。*这将忽略我的.tab。规则,我不知道该怎么走

find上的-regex测试应用于完整路径,而不仅仅是文件名。从手册页:

例如,要匹配名为“./fubar3”的文件,可以使用正则表达式“.*bar.”或“.*b.*3”,但不能使用“f.*r3”

soulmerge的回答提供了一种方法,可以将您的所有条件放入find语句中;你也可以用类似

find * -regex 'include-pattern' -a ! \( -regex 'exclude-pattern' [-o 'exclude-pattern2' ...] \)
如果要组合多个模式以排除,无论是在管道grep中还是在find的正则表达式中,只需使用或:

grep -v '\.svn\|.tab.\|.yy.'
egrep -v '\.svn|.tab.|.yy.'
请注意,对regex使用单引号是一个非常非常好的主意-您不希望任何$尝试变量扩展

编辑: 你建议的那些排除模式实际上不需要是正则表达式。只需使用-name即可获得它们,它只匹配实际名称,而不匹配整个路径

find * -regex 'include-pattern' -a ! \( -name .svn -o -name "*tab*" \)
注意:我想忽略当前文件夹和子文件夹中以“.”开头的文件,但不知道如何选择.svn

一个问题是我不知道怎么做。忽略是否从开始?工作我确信一个问题是我确实这样做了。*这将忽略我的.tab。规则,我不知道该怎么走

find上的-regex测试应用于完整路径,而不仅仅是文件名。从手册页:

例如,要匹配名为“./fubar3”的文件,可以使用正则表达式“.*bar.”或“.*b.*3”,但不能使用“f.*r3”

soulmerge的回答提供了一种方法,可以将您的所有条件放入find语句中;你也可以用类似

find * -regex 'include-pattern' -a ! \( -regex 'exclude-pattern' [-o 'exclude-pattern2' ...] \)
如果要组合多个模式以排除,无论是在管道grep中还是在find的正则表达式中,只需使用或:

grep -v '\.svn\|.tab.\|.yy.'
egrep -v '\.svn|.tab.|.yy.'
请注意,对regex使用单引号是一个非常非常好的主意-您不希望任何$尝试变量扩展

编辑: 你建议的那些排除模式实际上不需要是正则表达式。只需使用-name即可获得它们,它只匹配实际名称,而不匹配整个路径

find * -regex 'include-pattern' -a ! \( -name .svn -o -name "*tab*" \)

你的根本问题是你认为你可以做到这一点:

[^(~$|\.o$|\.exe)]
你不能

在这里的字符类中,可以包含或排除单个字符,但不能在其中编写表达式。就正则表达式引擎而言,上述内容相当于:

[^()~$|.oex]

我在Windows上,所以我不能给你一个经过测试的命令,你的帖子让我有点困惑,你到底想要哪些文件。因此,这意味着对于您的regex误解,您可以向正确的方向指出。

您的根本问题是您认为您可以做到这一点:

[^(~$|\.o$|\.exe)]
你不能

在这里的字符类中,可以包含或排除单个字符,但不能在其中编写表达式。就正则表达式引擎而言,上述内容相当于:

[^()~$|.oex]

我在Windows上,所以我不能给你一个经过测试的命令,你的帖子让我有点困惑,你到底想要哪些文件。因此,这意味着对于您的regex误解,这是一个正确方向的指示。

Grep支持多种模式。例如:

grep -v -e "\.svn" -e ".tab." -e ".yy."

Grep支持多种模式。例如:

grep -v -e "\.svn" -e ".tab." -e ".yy."
也找到苏
加油!对于not,大多数版本都支持-不是同义词,但它不是POSIX.find也支持!对于not,大多数版本都支持-not作为同义词,但它不是POSIX。这并不能满足您的需要。获得匹配只需要两个字符/[^.]。它将匹配路径中任何包含非隐藏文件的内容,而不仅仅是路径的最后一个组件,例如/home/username/.svn。@Jefromi:不会为我返回任何内容。这不会满足您的要求。获得匹配只需要两个字符/[^.]。它将匹配路径中任何位置包含非隐藏文件的任何内容,而不仅仅是路径的最后一个组件,例如/home/username/.svn。它将匹配。@Jefromi:不为我返回任何内容。在grep示例中,您应该将\|替换为`| `不,这是扩展正则表达式的一部分。我用它添加了一个egrep行。在grep示例中,您应该用“|”替换\,不,这是扩展正则表达式的一部分。我用它添加了一个egrep行。我怀疑在这个例子中regex是完全没有必要的。正如我后来在回答中指出的,您可以只使用-name。类似查找*!\-我希望是name*.o-o-name*.exe-o…\。我还认为find可以在没有regex的情况下完成它。我对它不是很熟悉,但我看到了OP犯下的主要正则表达式错误。@Tomalak-是的,你在这一点上绝对是对的。我看到了最后一个脚本,错误地将最初的inclusive regex略过了OP明确询问的部分。接得好。我怀疑在这种情况下,正则表达式是完全没有必要的。正如我后来在回答中指出的,您可以只使用-name。类似查找*!\-我希望是name*.o-o-name*.exe-o…\。我还认为find可以在没有regex的情况下完成它。我对它不是很熟悉,但我看到了OP犯下的主要正则表达式错误。@Tomalak-是的,你在这一点上绝对是对的。我看到了最后一个脚本,错误地将最初的inclusive regex略过了OP明确询问的部分。抢手货