【问题标题】:While loop inserted with sed用 sed 插入的 while 循环
【发布时间】:2017-10-17 12:12:17
【问题描述】:

我试图在第二次出现的字符串中向配置文件中添加多行。我可以让我的 While 循环将代码附加到文件的末尾,但它需要插入到某行下方和另一行上方

<$site_conf tr '\n' '\0' |
sed -e "s/.*/$(yes '\0' | head -n 1 | tr -d '\n')/g" |
tr '\0' '\n' >> $site_conf
sed -i '0,/*:80/! {0,/*:80/ s/*:80/*:443/}' $site_conf
TEMPLATE='SSLEngine.txt'
while read LINE; do
    echo $LINE |
    sed 's/${SSLplaceholder}/'${SSLdomain}'/' >> $site_conf
done < $TEMPLATE;;

这会产生一个像这样的配置文件:

<VirtualHost *:80>
ServerName mysite.preview.something.com
DocumentRoot /home/mysite/web/content

<Directory /home/mysite/web/content>
Options +FollowSymLinks -Indexes
AllowOverride All
Require all granted
</Directory>

LogLevel warn
ErrorLog /home/mysite/web/log/mysite-error.log
CustomLog /home/mysite/web/log/mysite-access.log combined
</VirtualHost>
<VirtualHost *:443>
ServerName mysite.preview.something.com
DocumentRoot /home/mysite/web/content
<Directory /home/mysite/web/content>
Options +FollowSymLinks -Indexes
AllowOverride All
Require all granted
</Directory>

LogLevel warn
ErrorLog /home/mysite/web/log/mysite-error.log
CustomLog /home/mysite/web/log/mysite-access.log combined
</VirtualHost>
SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5
SSLCertificateFile /etc/apache2/ssl/domain.com.crt
SSLCertificateKeyFile /etc/apache2/ssl/private/domain.com.key
SSLCertificateChainFile /etc/apache2/ssl/int.crt

我希望将最后 6 行插入到第二个 ServerName 行下方和 DocumentRoot 行之前。有什么想法吗?

【问题讨论】:

  • 问题有两部分:找到第二行ServerName,插入六行。使用 sed 的 r 命令插入六行很容易,但我在找到第二行 ServerName 时遇到了一些麻烦...

标签: bash sed while-loop scripting


【解决方案1】:

好的 - 这是最终满足我所有要求的方法:

    ssltemplate="ssltemplate.txt"
    <$site_conf tr '\n' '\0' |
    sed -e "s/.*/$(yes '\0' | head -n 1 | tr -d '\n')/g" |
        tr '\0' '\n' >> $site_conf
    sed -i '0,/*:80/! {0,/*:80/ s/*:80/*:443/}' $site_conf
    TEMPLATE='SSLEngine.txt'
    while read LINE; do
        echo $LINE |
        sed 's/${SSLplaceholder}/'${SSLdomain}'/' >> $ssltemplate
    done < $TEMPLATE
    sed -i '1,/ServerName/{p;d}; /ServerName/,$ {1,1 r ssltemplate.txt
    }' $site_conf
    rm -r ssltemplate.txt

【讨论】:

    【解决方案2】:

    如果文件中有六行,其名称在变量 TEMPLATE 中(并且我正确处理了变量),那么这里有一个 sed 命令可以执行此操作:

    sed '/DocumentRoot/,/ServerName/ {
    /ServerName/r '"${TEMPLATE}"'
    }'
    

    【讨论】:

    • 我认为问题的文本要插入到$TEMPLATE 命名的文件中。修复它对您的脚本没有太大影响,但更接近问题。
    • @JonathanLeffler:谢谢!
    • 这看起来很有希望,谢谢。我在完成脚本时遇到了麻烦,因为我的 While 循环正在读取模板文件的每一行,并在将其插入我的配置文件之前,在每一行上用 domain.com 替换 ${SSLplaceholder}。将新的 sed 语句放在 while 循环内会导致脚本回显 Template 的内容而不写入配置文件,将其放在循环外会导致脚本无法完成。
    • @DeltaMike:所以将while 循环与配置文件分离。让while 循环读取模板文件,进行替换,然后将其写入另一个文件,也许称它为sixlines。然后使用 sed 命令将sixlines 插入到配置文件中。 (不是唯一的方法,但也许是最简单的方法。)
    • @Beta 非常感谢 - 我知道逆向工程了一些类似问题的其他答案
    猜你喜欢
    • 2015-01-14
    • 2022-01-07
    • 1970-01-01
    • 2020-05-17
    • 2021-02-04
    • 2017-12-09
    • 1970-01-01
    • 2015-12-22
    • 2021-06-03
    相关资源
    最近更新 更多