删除文本模式中的某些字符

删除文本模式中的某些字符

我有一个包含 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]

相关内容