如何替换变量中的脚本并在脚本中使用变量?

时间:2018-01-30 17:58:36

标签: linux bash shell variables sed

我需要在变量中替换此脚本中的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"'

2 个答案:

答案 0 :(得分:0)

类似

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"

(并注意到通常人们会期望前缀在头部,而后缀在最后......;但那是人们所期望的,基于他们的名字)

答案 1 :(得分:0)

虽然在这种情况下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更容易阅读。但这只是我个人的偏好。