Regular-Expression

Markdown 中腳註的正則表達式

  • July 20, 2019

我正在準備一份降價文件以供列印和作為 EPUB 文件。我想刪除 EPUB 文件單詞定義的腳註。

我要刪除的腳註的格式[mean-X]可以X是任何一組字母數字字元(包括另一個-)。

我試過了:

grep -o "\[\^mean-.*\]"

樣本結果:

[^mean-vicissitudes]
[^mean-immortality]
[^mean-ingot]
[^mean-remonstrance]
[^mean-libeller]
[^mean-debauched] and the most amorous[^mean-amorous]
[^mean-turpitude]
[^mean-debauched] drunken, licentious,[^mean-licentious]
[^mean-frivolous]
[^mean-despots]
[^mean-repentance]
[^mean-ignominy]
[^mean-vain]
[^mean-presumptuousness] haughtiness,[^mean-haughtiness]

當兩個或多個腳註出現在同一行時,就會出現問題,正則表達式會延伸到最後一次出現的 a ]

我也試過:

  1. grep -o "\[\^mean-.*\][^\[]"它仍然有一些像原來一樣的事件,以及在最後一個 之後擷取逗號和冒號]
  2. grep -o "\[\{1\}\^mean-.*\]"但這並不能解決問題。我認為它只會擷取一個[.
  3. grep -o "\[\^mean-.*\]\{1\}"但它也不能解決問題。我認為它只會擷取一個].

如何使用 grep 擷取腳註並刪除它們(不是用空格替換它們,而是刪除它們)?

PS 我在 Windows 上使用 Git Bash,但我認為命令是相同的。

問題在於.*你的表達方式,即“貪婪”。這使您的表達式與該]行的其餘部分匹配,直到該行的最後]一行。相反,讓這部分錶達式只匹配您自己說它可能匹配的內容,即任何字母數字和-. 字母數字與 匹配[[:alnum:]],並[[:alnum:]-]允許括號中的表達式也匹配破折號:

\[\^mean-[[:alnum:]-]*\]

對您問題中的數據執行此操作:

$ grep -o '\[\^mean-[[:alnum:]-]*\]' file
[^mean-vicissitudes]
[^mean-immortality]
[^mean-ingot]
[^mean-remonstrance]
[^mean-libeller]
[^mean-debauched]
[^mean-amorous]
[^mean-turpitude]
[^mean-debauched]
[^mean-licentious]
[^mean-frivolous]
[^mean-despots]
[^mean-repentance]
[^mean-ignominy]
[^mean-vain]
[^mean-presumptuousness]
[^mean-haughtiness]

您的grep命令顯然會提取匹配項,但不會刪除它們。為此,請使用sed編輯腳本:

$ sed 's/\[\^mean-[[:alnum:]-]*\]//g' file





and the most amorous

drunken, licentious,





haughtiness,

再加上一些空行和初始空格的刪除,

$ sed 's/\[\^mean-[[:alnum:]-]*\]//g; /^[[:blank:]]*$/d; s/^[[:blank:]]*//' file
and the most amorous
drunken, licentious,
haughtiness,

或者,僅修改帶有 a 的行[^mean-...]

sed '/\[\^mean-[[:alnum:]-]*\]/{ s///g; /^[[:blank:]]*$/d; s/^[[:blank:]]*//; }' file

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