文本处理脚本:仅当整个模式匹配时才删除一组行

文本处理脚本:仅当整个模式匹配时才删除一组行

仅当整个模式匹配时,我才想删除一组行(全局)。

模式描述:

第 1 行:^[#]+ .*

第2行:^[[:space:]]*$

第3行:^-[[:space:]]*$

第4行:^[[:space:]]*$

第5行:^[#]+ .*$|^[-]+[[:space:]]*$

笔记:

  1. 第 3 行之后可以有空格-
  2. Line2 和 Line4 可能有空格字符或应该为空白
  3. 第 5 行,匹配^[#]+ .*$^[-]+[[:space:]]*$
  4. 我不想删除模式的最后一行,即Line5模式描述中的最后一行。

例子:

# Body

- Inside Body

# Summary

-

# Bibliography

- Read this book

预期产出:

# Body

- Inside Body

# Bibliography

- Read this book

笔记: 提供的解决方案有效,是否可以写得更清楚如下:

e = '(^|\n)[#]+ .*\
    \n[\t ]*\
    \n-[\t ]*\
    \n[\t ]*\
    \n([#]+ .*|[-]+[\t ]*)\n'

另外,我们如何针对多行模式的多次出现提供所提供的解决方案?

答案1

python 解决方案应该适用于 python2 或 3。从 stdin 读取,输出到 stdout。我所做的唯一一件事就是更改[[:space:]]to 的表达式[\t ]

#!/usr/bin/python3

import sys
import re
e='(^|\n)[#]+ .*\n[\t ]*\n-[\t ]*\n[\t ]*\n([#]+ .*|[-]+[\t ]*)\n'
print(re.sub(e, '\\1\\2\n', sys.stdin.read()))

相关内容