【问题标题】:Grep syntax - words have to end with ] if they start with [, all ^ followed by I or BGrep 语法 - 如果单词以 [ 开头,则必须以 ] 结尾,所有 ^ 后跟 I 或 B
【发布时间】:2013-10-19 04:43:58
【问题描述】:

我正在检查我的字幕文件的格式是否正确。 我正在寻找 3 个常见错误。

  1. “[00:01:22:00]”格式的时间戳 - 有时会忘记匹配的 ]。所以我想检查如果“[”出现在一行上,它正好有上面格式的11个字符,然后是一个匹配的“]”。常见的错误是缺少匹配的]
  2. 粗体和斜体 - 如果 ^B 或 ^I 出现在一行中,则它必须在同一行中具有匹配的 ^B 或 ^I。
  3. 如果 ^ 出现在一行中,则后面必须跟着 I 或 B

【问题讨论】:

  • 你想要怎样的输出?违反这些规则的行,或计数或文件名或...?
  • 告诉我们你尝试了什么

标签: regex shell unix grep


【解决方案1】:

执行所有这些的正则表达式:

^(.*\[(?![0-9][0-9]:[0-9][0-9]:[0-9][0-9]:[0-9][0-9]\]).*|.*\^(?![BI]).*|([^\^\n]*\^[^B\n])*[^\^\n]*\^B([^\^\n]*\^[^B\n])*[^\^\n]*|([^\^\n]*\^[^I\n])*[^\^\n]*\^I([^\^\n]*\^[^I\n])*[^\^\n]*)$

只需将其输入到启用正则表达式的文本编辑器的搜索栏中,它就会找到您问题中定义的任何错误行。

我使用 Notepad++ (Windows) 和 TextWrangler (Mac) 的查找功能对其进行了测试。它还应该与 Python 或任何其他支持负前瞻的 Regex 风格一起使用。搜索时,请确保选中“正则表达式”或“grep”旁边的复选框或圆圈。请注意,此正则表达式适用于 Linux grep,因为 grep 不支持环视。

这绝对不漂亮,但实际上只是将 4 个较小的正则表达式组合在一起,例如 ^(rule1|rule2|rule3B|rule3I)$

第一条规则是:

^.*\[(?![0-9][0-9]:[0-9][0-9]:[0-9][0-9]:[0-9][0-9]\]).*$

匹配任何带有“[”且不属于 [00:00:00:00] 模式的行,使用负前瞻。

第二条规则是:

^.*\^(?![BI]).*$

它匹配任何带有“^”的行,而不是紧随其后的 B 或 I,再次使用负前瞻,以便它也匹配行尾。

第三条规则是doozie:

^([^\^\n]*\^[^B\n])*[^\^\n]*\^B([^\^\n]*\^[^B\n])*[^\^\n]*$

匹配任何一行,其中恰好有一个文本 ^B 用于粗体。 ([^\^\n]*\^[^B\n])*[^\^\n]* 部分匹配不是^B 的任何内容,\^B 部分匹配^B。我已经包含\n 以防止在记事本++ 中进行多行匹配。如果您正在使用 grep 或任何已经在执行逐行正则表达式搜索的程序,则可以删除 \n

第四条规则就是第三条规则,用“I”代替“B”。

【讨论】:

  • 第一条规则 ^.*[(?![0-9][0-9]:[0-9][0-9]:[0-9][0-9] :[0-9][0-9]]).*$ 匹配所有时间码。如何修改它以匹配没有 [ 后跟匹配 ] 的情况
  • TC 使用 .对于 ms - 所以正确的第一条规则是 ^.*[(?![0-9][0-9]:[0-9][0-9]:[0-9][0-9].[ 0-9][0-9]]).*$
  • 对于任何 [ 后面没有 ],请使用 ^.*\[(?![^\n]*\]).*$。要使用 .对于女士,请使用^.*\[(?![0-9][0-9]:[0-5][0-9]:[0-5][0-9]\.[0-9][0-9]\]).*$。我还在这里限制了秒和分钟的范围,因为我不确定原始帖子中哪些是秒和分钟,所有分隔符都是:.
  • 第二条规则 - ^.*\^(?![BI]).*$ 在 text wrangler 中使用 grep 完美工作。但是,当我使用 grep '^.*\^(?![BI]).*$' *.txt 时,它不起作用。甚至 \^(?![BI]) 也可以在 Text Wrangler 中工作,但不能在 shell 中工作。有什么想法吗?
  • (?!foo) 语法,称为负前瞻,不适用于 grep,因为 grep 的正则表达式引擎不支持环视。 .*\^[^BI].*|.*\^ 在功能上与规则 2 相同,应该与 grep 一起使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-01
  • 2015-12-16
  • 1970-01-01
相关资源
最近更新 更多