变得无法终结'用sed命令(bash)

时间:2017-08-23 15:38:43

标签: bash shell sed

我的最终目标是在/etc/ufw/before.rules中的COMMIT行上方获取一堆文本。我试图用这样的东西替换COMMIT: TEXT I WANT\nCOMMIT

我认为这是一个简单的sed命令:echo COMMIT | sed "s@COMMIT@${morerules}@g"

我已将变量morerules设置为这样的字符串:

morerules="""
### Start HTTP ###
# Enter rule
-A ufw-before-input -p tcp --dport 80 -j ufw-http
-A ufw-before-input -p tcp --dport 443 -j ufw-http
# Limit connections per Class C
-A ufw-http -p tcp --syn -m connlimit --connlimit-above 50 --connlimit-mask 24 -j ufw-http-logdrop
# Limit connections per IP
-A ufw-http -m state --state NEW -m recent --name conn_per_ip --set
-A ufw-http -m state --state NEW -m recent --name conn_per_ip --update --seconds 10 --hitcount 20 -j ufw-http-logdrop
# Limit packets per IP
-A ufw-http -m recent --name pack_per_ip --set
-A ufw-http -m recent --name pack_per_ip --update --seconds 1 --hitcount 20 -j ufw-http-logdrop
# Finally accept
-A ufw-http -j ACCEPT
# Log
-A ufw-http-logdrop -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix \"[UFW HTTP DROP]\"
-A ufw-http-logdrop -j DROP
### End HTTP ##
"""

如您所见,我在引号中添加了反斜杠。设置变量是成功的。当我从上面echo COMMIT | sed "s@COMMIT@${morerules}@g"运行命令时,这是输出:

sed: -e expression #1, char 9: unterminated S' command`

我的字符串或我的sed命令出错了吗?此外,我知道其他人已经收到此错误,但他们的修复程序似乎都无法正常工作。

1 个答案:

答案 0 :(得分:2)

在替换文本中的每个换行符之前放置一个文字反斜杠,从而告诉sed它应该被视为同一个表达式的一部分:

orig=$'\n'; replace=$'\\\n'
sed "s@COMMIT@${morerules//$orig/$replace}@g"

(将值放在变量中可以更容易地以跨多个版本的bash的方式实现它。)