【问题标题】:Search and delete links in markdown files搜索和删除markdown文件中的链接
【发布时间】:2020-06-14 09:46:52
【问题描述】:

我不时在我的网站上运行链接检查器,外部链接 404 将被保存到日志文件中。

现在我尝试从 Markdown 文件中自动删除链接。我使用多语言网站,所以我开始将日志文件读入一个数组。

IFS=$'\n'
link=( $(awk '{print $7}' $ext) )

for i in "${link[@]}"; do
    grep -r $i content/* | sed -e 's/([^()]*)//g' 
done

此命令使用 () 删除链接和标题,但 [示例文本] 保留。我正在寻找一种删除 [] 的方法,这样最后我只能得到示例文本。

现在:

[Example Text](http://example.com "Example Title")

想要的结果:

Example Text

【问题讨论】:

  • 请提供预期输出的示例以帮助澄清问题
  • 目标是删除所有期望的示例文本。
  • 添加预期的输出。
  • $ext 中有什么内容?为什么要循环运行它?切线另见When to wrap quotes around a shell variable?

标签: arrays bash shell loops markdown


【解决方案1】:

假设

  • for i in "${link[@]}" 中的 i 在每个循环中都会计算为类似“http://example.com”的链接
  • 我们关心的 Markdown 文件中每个部分的格式将采用您描述的形式[Example Text](http://example.com "Example Title")

代码

IFS=$'\n'
link=( $(awk '{print $7}' $ext) )

for i in "${link[@]}"; do
    grep -ro "\[.*\].*${i}" content/* | grep -o '\[.*\]' | tr -d '[]'
done

说明

  • grep -ro "\[.*\].*${i}" content/*
    • 递归搜索以在目录中的所有文件上运行:grep -r ... content/*
    • 打印适用于我们正则表达式的文本:grep -o
    • 打印以[开头的任何内容,然后是.*,然后是],然后是我们的循环变量${i}的值(当前链接):"\[.*\].*${i}"
  • 从那个输出中,我们想要的只是"Example Text",它位于括号之间,所以任何不在括号之间的东西都需要去grep -o '\[.*\]'
  • 最后,我们要删除那些讨厌的括号:tr -d '[]'

【讨论】:

    【解决方案2】:

    直接的解决方法是扩展您的 sed 正则表达式。

    sed 's/\[\([^][]*\}\]([^()}*\)/\1/g'
    

    但可能更好的解决方法是一次性替换 content 中 Awk 脚本中的所有行。

    find content -type f -exec \
        sed -i 's%\[\([^][]*\)\('"$(
            awk 'NR>1 { printf "\|" }
                { printf "%s", $7 }')"'\)%\1%g'
    

    Awk 脚本生成一个长的正则表达式,如

    http://one.example.net/nosuchpage\|http://two.exampe.org/404\|https://three.example.com/broken-link
    

    来自输入中的所有链接,然后sed 脚本会替换方括号后括号中与此正则表达式匹配的任何链接。 (也许你会想要扩展它以允许在右圆括号之前的链接之后引用字符串,就像在你的例子中一样;我觉得我已经对你真正希望完成的事情提出了太多的问题。)

    如果您使用的是 *BSD 平台(包括 MacOS),则需要在 -i 参数后添加一个空字符串 ar[ument,例如 sed -i '' 's%...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多