【问题标题】:How to replace script in variable and use variable in script?如何替换变量中的脚本并在脚本中使用变量?
【发布时间】:2018-07-09 17:03:25
【问题描述】:

我需要在这个脚本中的变量中替换sed 行,然后只使用变量。

cat postfix > "file.html" 
cal -h | sed '1{s|^|<table>\n<tr><th colspan="7">|;s|$|</th></tr>|};2,${s|\(..\) |<td>\1</td>|g;s|^|<tr>|;s|$|</tr>|};$s|$|\n</table>|' >> file.html
cat prefix >> "file.html"'

【问题讨论】:

    标签: linux bash shell variables sed


    【解决方案1】:

    类似

    expression='1{s|^|<table>\n<tr><th colspan="7">|;s|$|</th></tr>|};2,${s|\(..\) |<td>\1</td>|g;s|^|<tr>|;s|$|</tr>|};$s|$|\n</table>|'
    
    cat postfix > "file.html"
    cal -h | sed "${expression}" >> file.html
    cat prefix >> "file.html"
    

    (并注意通常人们会期望前缀在开头,而后缀在末尾......;但这是人们所期望的,基于他们的名字)

    【讨论】:

    • 如何替换其他文件变量中的脚本并在本文件中使用该变量?
    • 您可以将表达式的内容放在一个或多个文件中,然后将其读取并连接; expression="$(cat "expressions.txt")" 或更多文件: expression="$(cat "expression_header.txt" "expression_middle.txt" "expression_footer.txt")"
    【解决方案2】:

    虽然在这种情况下sed 可能会奏效,但我认为是否需要维护这段代码并不是一个好主意。

    关于前文件和后文件的一点说明:一般来说,前缀是你放在前面的东西,后缀是你放在后面的东西。反过来做会增加混乱。

    你想要的是将第一行作为标题,其余的在表格单元格中拆分出来。

    cal -h > tempfile
    cat postfix > "file.html"
    echo '<table>' >> "file.html"
    echo '<tr><th colspan="7">' >> "file.html"
    head -1 tempfile >> "file.html"
    echo '</th></tr>' >> "file.html"
    tail +1 | sed 's/^/<tr>;s/\(/<td>/g;s/\)/<\/td>/g;s/$/<\/tr>/' >> "file.html"
    echo '</table>' >> "file.html"
    rm tempfile
    

    这已经使它更具可读性。

    甚至更进一步:

    first=yes
    cat postfix > "file.html" #sic
    echo '<table>' >> "file.html"
    cal -h | while read line ; do
        if [ $first = yes ] ; then
            first=no
            echo "<tr><th colspan=\"7\">$line</th></tr>" >> "file.html"
        else
            tdopen=${line//\(/<td>}
            tdclose=${tdopen//\)/<\/td>}
            echo "<tr>$tdclose</tr>" >> "file.html"
        fi
    done
    echo '</table>' >> "file.html"
    cat prefix >> "file.html" #sic
    

    我认为它比sed-clutter 更具可读性。但这只是我个人的喜好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      • 2021-12-11
      • 2012-11-02
      • 1970-01-01
      • 2014-06-08
      相关资源
      最近更新 更多