【问题标题】:Help with regular expression and grep in Linux terminalLinux终端中的正则表达式和grep帮助
【发布时间】:2010-07-13 13:25:02
【问题描述】:

我是正则表达式和 grep 的新手,但我一直在努力学习它以在使用控制台工具时为我提供帮助。

我必须使用 cvs,当我更新一些文件时,我不需要查看未更新的文件或带有 *.pyc 扩展名的文件。所以,我创建了一个脚本,调用:

cvs update -d | grep -v 'pyc$' | grep -v '^\?'

第一个问题:为什么cvs update -d | grep -v '(pyc$|^\?)'不起作用,所以我需要使用cvs update -d | grep -v 'pyc$' | grep -v '^\?'

第二个问题:未更新的文件以一行开头:

-f update: Updating FILE

我试过grep -v '^\-f'grep -v '^-f',但没有运气。我的表达有什么问题?是正则表达式问题还是我不​​知道的关于 Linux 的问题?

谢谢!

【问题讨论】:

  • grep -c '^-f' 工作正常,实际行是否以空格或其他内容开头? (您可以通过 hexdump 或 od 进行管道检查)

标签: regex linux terminal cvs grep


【解决方案1】:

只回答你问题的一部分:

您应该尝试 egrep 而不是 grep,因为 |(交替)和 ( )(分组)仅受 egrep 支持。

编辑:

第二个问题可能会发生,因为 cvs 将一些行写入 stderr,因此您需要通过将 2>&1 附加到您的命令来将 stderr 重定向到 stdout。

【讨论】:

  • 好的,egrep 完美运行。对第二个问题有什么建议吗?
  • 这是一个很好的答案,如果可以的话,我会更多地支持它。我想我需要更多地研究一下 Linux 中的流。 en.wikipedia.org/wiki/Standard_streams谢谢堆垛机!
【解决方案2】:

我必须使用cvs,并且当我更新时 有些文件,我不需要看文件 未更新或使用 *.pyc 例如扩展名。

如果这是您想要解决的实际问题(实际上是两个独立的问题),那么对 CVS 的输出使用 grep 从一开始就是错误的解决方案。

对于 pyc,您应该在项目中添加一个 .cvsignore 文件,其中包含 *.pyc 的一行,或者将该行添加到现有的 .cvsignore 文件中。这将使 CVS 完全忽略所有 pyc 文件,而不是将它们列为未知。

.cvsignore 文件适用于包含 .cvsignore 的文件夹下的所有文件和子目录,因此,如果所有 pyc 文件都在项目的特定子目录中,您将在该子目录中添加 cvsignore 文件,否则只需添加它在项目的根文件夹中。

至于忽略未更新的文件 - 我认为您所指的“cvs update: Updating foo”输出是 cvs update 为存储库中每个访问的目录打印的内容。要消除此打印输出,请在 CVS 中使用 -q 标志(此标志位于 更新命令之前,如下所示:cvs -q update -d)。

【讨论】:

  • 我喜欢你的方法。 +1。但是我将另一个答案标记为已接受,不仅因为它解决了我的问题,而且我还学到了更多关于 grep 的知识。我在您提供的参数不可用的其他场景中使用它。
  • 你知道很多 cvs...你介意帮助我解决我在这里问的关于 cvs 的 0 答案的问题吗? :)
  • 我测试了 -q,它有效,但 .cvsignore 无效。我在我的项目根文件夹中创建了一个 .cvsignore,带有“* .pyc”,当我运行 cvs update 时它们一直显示。
  • 放入项目根目录时它不起作用,但在主文件夹中时它起作用。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-10
  • 1970-01-01
相关资源
最近更新 更多