【问题标题】:Replacing several lines in a html file with sed, from a single csv file从单个 csv 文件中用 sed 替换 html 文件中的几行
【发布时间】:2017-12-01 01:24:15
【问题描述】:

我想使用 sed 命令替换 html 文件中的几行,从 csv 文件中获取信息。

这是我要编辑的html(Test.html)的摘要,(“/**/”是要编辑的行):

    series: [{
        name: 'Alerta',
        color: "orange",
/*1*/   data: [4, 3, 4]
        }, {
        name: 'Pre-Emergencia',
        color: "red",
/*2*/   data: [0, 0, 0]
        }, {
        name: 'Emergencia',
        color: "purple",
/*3*/   data: [0, 0, 0]
            }]

这是我要从中获取新值的 CSV (Test.csv):

/*1*/       data: [3, 5, 5]
/*2*/       data: [1, 3, 1]
/*3*/       data: [10, 6, 4]

这是我现在正在使用的脚本(它只适用于从一个包含一行的 csv 文件中替换一行)

export TEST1="$(sed 's/ //g' Test.csv)" 
export TEST2="$(sed 's/ //g' Test.csv)" 
export TEST3="$(sed 's/ //g' Test.csv)"
sed -i -e '/*1*/c\'"$TEST1"'' Test.html
sed -i -e '/*2*/c\'"$TEST2"'' Test.html
sed -i -e '/*2*/c\'"$TEST2"'' Test.html

我哪里错了?脚本应该如何使其工作? 非常感谢!

【问题讨论】:

    标签: html bash csv sed sh


    【解决方案1】:

    使用单个 awk 命令:

    awk -F'[[:space:]][[:space:]]+' 'NR==FNR{ a[$1]=$2; next }
           $1 in a{ $2="  "a[$1] }1' Test.csv Test.html
    

    输出:

        series: [{
            name: 'Alerta',
            color: "orange",
    /*1*/   data: [3, 5, 5]
            }, {
            name: 'Pre-Emergencia',
            color: "red",
    /*2*/   data: [1, 3, 1]
            }, {
            name: 'Emergencia',
            color: "purple",
    /*3*/   data: [10, 6, 4]
                }]
    

    【讨论】:

    • 也许我做错了,但是当我在脚本中添加该行时,终端只显示 html 代码,但没有任何变化。
    • 这个解决方案适用于我给定的数据。我不知道它为什么有效,但它有效。
    【解决方案2】:

    我将 Test.csv 转换为 sed 命令列表并将其通过管道传递给 sed:

    sed -e 's/\*/\\*/g' -e 's|data.*$|s/data.*$/&/|' Test.csv | sed -f- Test.html

    这是做什么的:

    • -e 's/\*/\\*/g' 将 Test.csv 中的每个 * 转换为 \*
    • -e 's|data.*$|s/data.*$/&/|'data: [3, 5, 5] 变成s/data.*$/data: [3, 5, 5]/
    • sed -f- Test.html 从管道中获取 sed 命令并在 Test.html 上运行

    sed -e 's/\*/\\*/g' -e 's|data.*$|s/data.*$/&/|' Test.csv 的中间输出为:

    /\*1\*/ s/data.*$/data: [3, 5, 5]/ /\*2\*/ s/data.*$/data: [1, 3, 1]/ /\*3\*/ s/data.*$/data: [10, 6, 4]/

    因此,对 Test.html 使用上述命令会得到以下输出:

    系列: [{ 名称:“警报”, 颜色为橙色”, /*1*/ 数据:[3, 5, 5] }, { name: 'Pre-Emergencia', 红色”, /*2*/ 数据:[1, 3, 1] }, { 名称:'紧急情况', 颜色:“紫色”, /*3*/ 数据:[10, 6, 4] }]

    【讨论】:

      猜你喜欢
      • 2013-06-20
      • 1970-01-01
      • 1970-01-01
      • 2017-12-03
      • 2017-11-08
      • 2020-11-19
      • 1970-01-01
      • 1970-01-01
      • 2013-09-25
      相关资源
      最近更新 更多