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明确询问的部分。抢手货