我正在准备一个 Markdown 文档以供打印和 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]
当两个或多个脚注出现在同一行时,正则表达式会扩展到最后一次出现]
.
我也尝试过:
grep -o "\[\^mean-.*\][^\[]"
其中仍然有一些像原来一样的情况,并在最后一个之后捕获逗号和冒号]
。grep -o "\[\{1\}\^mean-.*\]"
但这并不能解决问题。我认为它只会捕获 a 的一个实例[
。grep -o "\[\^mean-.*\]\{1\}"
但它也不能解决问题。我认为它只会捕获 a 的一个实例]
。
如何使用 grep 捕获脚注并删除它们(不是用空格替换它们,而是消除他们)?
PS 我使用的是 Windows 版 Git Bash,但我认为命令是相同的。
答案1
问题在于.*
你的表达方式,即“贪婪”。这使得您的表达式]
与该行的其余部分匹配,直到]
该行的最后一个。相反,使表达式的这一部分仅匹配您自己所说的可能匹配的内容,即任何字母数字和-
。字母数字与 , 匹配[[: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,
或者,仅修改带有 的行[^mean-...]
,
sed '/\[\^mean-[[:alnum:]-]*\]/{ s///g; /^[[:blank:]]*$/d; s/^[[:blank:]]*//; }' file