【问题标题】:SUBLIME with GREP: Search for words, ignoring certain linesSUBLIME with GREP:搜索单词,忽略某些行
【发布时间】:2020-01-21 12:45:12
【问题描述】:

我有一个超过 24,000 行的长文本文档。 当单词单独出现在一行时,我需要搜索 83 个不同的单词并删除这 83 个单词的所有实例(参见下面的示例)。单词将被删除。但搜索必须忽略:

  • 所有只有大写文本的行
  • § 符号开头的所有行(无论该行的其余部分是大写还是小写字母)。

例子

§History of TIME
HISTORY OF TIME
of
Future
Past
Of
Many Of
Official
Officer
North of the town
I am one of them 

如果我搜索Of,那么上面只会突出显示第三行和第六行。

第一行不会突出显示,因为它以§ 开头。

第二行不会突出显示,因为它全部大写。

Many ofNorth of the townI am one of them 不会突出显示,因为它本身不是 Of

这在 Sublime 中可行吗?我认为搜索所有 83 个单独的单词会使查询过于复杂。但是,如果我可以一次搜索一个单词(确保它跳过大写字母中的所有行以及所有以§ 开头的行,那么就可以了)。

如果这在 Sublime 中是不可能的,我可以使用其他方法吗?

【问题讨论】:

  • §$? ...
  • Many of would not be highlighted, because it is not Of on its own. 是什么意思 - 你的意思是你的搜索必须区分大小写?
  • 或者它必须是该行中唯一的单词,但在这种情况下为什么要排除大写单词等?
  • The lines that are all uppercase - 所以你只想排除 ^OF$ 因为如果你正在寻找只有 of 的行,就不会有任何其他大写字母。
  • 评论不用于扩展讨论;这个对话是moved to chat

标签: regex grep sublimetext3


【解决方案1】:

当一行不以§ 开头或全大写且不属于many ofnorth ofone of 等短语时,您说要删除所有出现的of .

使用

查找(^(?:(?:§.*|[^[:alpha:]\n\r]*[[:upper:]]+(?:[^[:alpha:]\n\r]+[[:upper:]]+)*[^[:alpha:]\n\r]*))$|(?i:\b(?:many|north|one)\s+of\b))|(?i:\bof\b)
替换$1

regex demo

详情

  • (^(?:(?:§.*|[^[:alpha:]\n\r]*[[:upper:]]+(?:[^[:alpha:]\n\r]+[[:upper:]]+)*[^[:alpha:]\n\r]*))$|(?i:\b(?:many|north|one)\s+of\b)) - 捕获组 1(与替换模式中的 $1 占位符一起引用):
    • ^ - 行首
    • (?: - 一组:
      • §.*
      • | - 或
      • [^[:alpha:]\n\r]*[[:upper:]]+(?:[^[:alpha:]\n\r]+[[:upper:]]+)*[^[:alpha:]\n\r]* - 除了 LF/CR 符号和字母之外的 0+ 个字符,然后是 1+ 个大写字母,然后是 0+ 个非换行符和非字母字符序列,后跟 1+ 个大写字母,并以 0+ 个非-换行符和非字母字符
      • )$ - 结束
    • |
      • (?i:\b(?:many|north|one)\s+of\b) - 不区分大小写的组匹配 manynorthone,后跟 1+ 个空格,然后 of 作为整个单词
  • | - 或
  • (?i:\bof\b) - 不区分大小写的组:of 作为一个整体。

查看 SublimeText3 测试,注意选择正则表达式模式区分大小写的匹配:

【讨论】:

    猜你喜欢
    • 2019-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 2013-06-16
    • 2021-03-14
    相关资源
    最近更新 更多