我有一个包含 Markdown 文件的文件夹,其中包含带有 Pandoc 格式的 citekeys 的文本[@Name:2021]
。我决定从我的 citekeys 中删除冒号,并希望在我的 markdown 文件中自动删除它们。 citekey 可以采用以下形式:
[@Name:2021]
[@Name:2021, 10]
[@Name:Title]
[Vgl. @Name:2021]
[Vgl. @Name:2021, 20--30]
所以他们应该成为:
[@Name2021]
[@Name2021, 10]
[@NameTitle]
[Vgl. @Name2021]
[Vgl. @Name2021, 20--30]
我最近添加的一些 citekey 已经不包含冒号了。当然,格式中可能还有一些^[Text]
包含冒号的脚注,不应删除。
是否有任何命令行实用程序的命令/脚本可以让我自动删除所有 markdown 文件的 citekeys 中的冒号?感谢您的帮助!
答案1
perl 在这里很方便: 的替换部分s///
可以作为代码进行计算:
perl -pe 's/\[[^]]*@.+?\]/ ($cite = $&) =~ s{:}{}g; $cite /ge' file
输出
[@Name2021]
[@Name2021, 10]
[@NameTitle]
[Vgl. @Name2021]
[Vgl. @Name2021, 20--30]
如果您对输出感到满意,可以使用以下命令将更改保存回文件
perl -i -pe ...
答案2
使用 GNU并对当前目录中的所有非隐藏文件应用类型就地 ( )sed
的全局替换:'s/regexp/replacement/g'
-i
sed -i -- 's/\(\[[^]@]*@[^]:]*\):\([^]]*\]\)/\1\2/g' *
s/
开始替换\(
打开第一个捕获组\[
匹配字面量[
[^]@]*
匹配任何非字符]
和非@
字符@
匹配字面量@
[^]:]*
匹配任何非字符]
和非:
字符
\)
关闭第一个捕获组:
匹配字面量:
\(
打开第二个捕获组[^]]*
匹配任何非]
字符\]
匹配字面量]
\)
关闭第二个捕获组/
更换分离器\1\2
包含捕获组的替换字符串/g
结束替换,g
全局替换
在运行此命令之前创建目标目录的备份,或更改-i
为-i'.bak'
保留后缀为 的原始文件的副本.bak
。使用您选择的 diff 工具将原始文件与结果进行比较。
答案3
如果您不想更改的行是以 开头的行^
,我认为这个命令可以解决问题:
sed '/^\^/!s/://' file
答案4
使用perl
:
$ perl -lpe 'my($p1, $p2);
substr($_, $p1, $p2-$p1) =~ s/(@[^:]+):/$1/
while
$p1 = 1+index($_, "[", $p2)
and
$p2 = 1+index($_, "]", $p1);
' file
[
$p1/$p2 是以及]
其后的a的位置。- 然后 substr() 传递块的开头 + 块长度,并且 s/// 命令对该块进行操作,并且当前记录 $_ 也被更新。
输出:
@Name2021]
[@Name2021, 10]
[@NameTitle]
[Vgl. @Name2021]
[Vgl. @Name2021, 20--30]