用bash替换不同的markdown网址图片

时间:2019-03-01 11:00:40

标签: bash sed markdown

这个问题与我在stackoverflow中看到的其他问题不同,因为它必须在特殊字符(如]或)中查找字符串,并替换与markdown文本关联的不同文本字符串url。 在其他解决方案中,我发现只有文本替换,无法在循环中找到和替换其他文本。

  1. 我将这些图像标记为降价文字: kubectl describe pods podname -n namespace 还有来自imgur的新图像,来自该变量: ... ![Image 1](https://i.imgur.com/BHoO2Wr.png "Alt Text 1") ... ![Image 2](https://i.imgur.com/qNxviLS.png "Alt Text 2") ...

如何在bash中将旧图像更改为新图像?

更改此项:xY0DgmM为BHoO2Wr

  1. 第二个问题:

如果我的图像是这样的: NEW_IMG1="https://i.imgur.com/xY0DgmM.png" NEW_IMG2="https://i.imgur.com/E98NLTT.png"

如何在bash中更改xY0DgmM的BHoO2Wr和E98NLTT的qNxviLS?

2 个答案:

答案 0 :(得分:1)

现在,这看起来像是sed的工作:)

# The file containing your markup
FILE="myMarkdown.txt"
# A list of new URLs, first = [Image 1], second = [Image 2]...
IMG=("https://i.imgur.com/xY0DgmM.png" "https://i.imgur.com/E98NLTT.png")
COUNT=1

for i in "${IMG[@]}"; do
        sed -i "s#\[Image $COUNT\](https://i.imgur.com/\(.*\) \(\"Alt Text.*\")\)#\[Image $COUNT\]($i \2#" "$FILE"
        COUNT=$((COUNT+1))
done

只需将其另存为脚本,更改两个第一个变量,然后在您喜欢的bash解释器中运行它即可:)

答案 1 :(得分:1)

使用GNU awk将第三个参数匹配():

$ NEW_IMG1="https://i.imgur.com/xY0DgmM.png"
$ NEW_IMG2="https://i.imgur.com/E98NLTT.png"

$ awk -v new="$NEW_IMG1 $NEW_IMG2" '
    BEGIN { split(new,images) }
    match($0,/^(!\[Image *([0-9]+)]\()[^ ]*(.*)/,a) {
        $0=a[1] images[a[2]] a[3]
    }
1' file
...
![Image 1](https://i.imgur.com/xY0DgmM.png "Alt Text 1")
...
![Image 2](https://i.imgur.com/E98NLTT.png "Alt Text 2")
...

如果实际上只是按照显示顺序替换图像,而不是用输入文件中的数字([Image 1]等)替换,那么它将是:

match($0,/^(!\[Image[^]]+]\()[^ ]*(.*)/,a) {
    $0=a[1] images[++cnt] a[2]
}

并匹配方括号内的任何文本:

match($0,/^(!\[[^]]+]\()[^ ]*(.*)/,a) {
    $0=a[1] images[++cnt] a[2]
}