使用sed在附加文本之前附加两个新行

时间:2013-11-20 22:54:03

标签: regex bash sed

我已经打了一个傻瓜(对我来说)。我在服务器构建过程中尝试在RHEL5 / etc / sysconfig / iptables文件中插入两个换行符(使用kickstart安装后脚本)。

具体的sed命令是:

${SED} -i "/-i lo/ a\
\n\n#Trusted Traffic\n-A INPUT -s 10.153.156.0/25,10.153.174.160/27 -d ${MGTIP} -m state --state NEW -j ACCEPT\n\n#Remote Access\n-A INPUT -s 10.120.80.0/21,10.152.80.0/21,10.153.193.0/24,172.18.1.0/24,${MGTNET}/${NUMBITS} -d ${MGTIP} -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT\n\n#Backups\n-A INPUT -s 10.153.147.192/26 -d ${BKPIP} -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT\n\n" ${IPTABLES}

这实际上是一个更大的脚本的一部分。 $ {SED}和$ {IPTABLES}已设置为必要值。

除前两个外,所有新行都有效。或者,更准确地说,前两个中的第二个。即使是ACCEPT工作后的最后两个新行。前两个换行符的结果是第一个起作用,在匹配包含-i lo的iptables条目后创建换行符。但是,第二个只是在#Trusted Traffic文本之前插入文字“n”。

最终看起来像

(snip)
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
n#Trusted Traffic
-A INPUT (snip)

我尝试了各种确保插入第二个换行符的方法。我使用了两个空行而不是\n\n。我在单独的行上使用了两个换行符,我使用了\\n\\n。到目前为止我尝试的所有内容都会产生相同的结果:插入文字“n”而不是第二个换行符。

sed是否在附加文本的开头不能使用两个换行符?是否有办法使这项工作完全不知道?

3 个答案:

答案 0 :(得分:1)

有趣的是,我原以为你尝试过的解决方案之一会起作用,但我看到了同样的行为。这是一个可能的解决方案:

${SED} -i -e "s/-i lo.*/\0\n\n/" -e "// a\
#Trusted Traffic\n-A INPUT -s 10.153.156.0/25,10.153.174.160/27 -d ${MGTIP} -m state --state NEW -j ACCEPT\n\n#Remote Access\n-A INPUT -s 10.120.80.0/21,10.152.80.0/21,10.153.193.0/24,172.18.1.0/24,${MGTNET}/${NUMBITS} -d ${MGTIP} -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT\n\n#Backups\n-A INPUT -s 10.153.147.192/26 -d ${BKPIP} -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT\n\n" ${IPTABLES}

首先将两个换行符附加到上一行的末尾,然后执行追加操作。

答案 1 :(得分:1)

我不明白为什么它也不起作用,但你也可以用替代选项而不是追加来做到这一点:

${SED} -i "s%-i lo.*%&\n\n#Trusted Traffic\n-A INPUT -s 10.153.156.0/25,10.153.174.160/27 -d ${MGTIP} -m state --state NEW -j ACCEPT\n\n#Remote Access\n-A INPUT -s 10.120.80.0/21,10.152.80.0/21,10.153.193.0/24,172.18.1.0/24,${MGTNET}/${NUMBITS} -d ${MGTIP} -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT\n\n#Backups\n-A INPUT -s 10.153.147.192/26 -d ${BKPIP} -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT\n\n%" ${IPTABLES}

答案 2 :(得分:0)

不确定可移植性,但请尝试:

${SED} '/-i lo/ a\
\
\
'"#Trusted Traffic\\
-A INPUT -s 10.153.156...
"

这种技术适用于BSD sed。您可以在整个过程中保持双引号:

${SED} "/-i lo/ a\\
\\
\\
#Trusted Traffic\\
-A INPUT -s 10.153.156...
"

在任何一种情况下,反斜杠和行尾都必须没有空格。