Shell-Script

文本處理腳本:僅當整個模式匹配時才刪除一組行

  • December 19, 2018

只有當整個模式匹配時,我才想刪除一組行(全域)。

圖案說明

第 1 行:^[#]+ .*

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

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

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

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

注意

  1. Line3 後面可以有空格-
  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'

此外,我們如何為多行模式的多次出現提供提供的解決方案?

python 解決方案,應該適用於 python2 或 3。從標準輸入讀取,輸出到標準輸出。我做的唯一一件事就是將表達式更改為[[: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()))

引用自:https://unix.stackexchange.com/questions/489685