String 在文件中查找字符串并使用bash和sed添加内容

String 在文件中查找字符串并使用bash和sed添加内容,string,bash,sed,String,Bash,Sed,我试图在一个特定的搜索字符串之后添加一个带有一堆文件名(包括目录斜杠)的字符串到一个文件中 我创建的输入文本如下所示: for f in /tmp/et/*.rules; do #STRING+=`basename "$f"`$'\n'; STRING+=$'include $RULE_PATH/et/'`basename "$f"`$'\n' done sed -i.bak 's!^#EMERGING\ THREATS\ RULESET.*$!& \n'"$STR

我试图在一个特定的搜索字符串之后添加一个带有一堆文件名(包括目录斜杠)的字符串到一个文件中

我创建的输入文本如下所示:

for f in /tmp/et/*.rules; do 
    #STRING+=`basename "$f"`$'\n'; 
    STRING+=$'include $RULE_PATH/et/'`basename "$f"`$'\n'
done
sed -i.bak 's!^#EMERGING\ THREATS\ RULESET.*$!& \n'"$STRING"'!' snort.conf
这使得
$STRING
相等:

include $RULE_PATH/et/emerging-activex.rules
include $RULE_PATH/et/emerging-attack_response.rules
include $RULE_PATH/et/emerging-botcc.portgrouped.rules
include $RULE_PATH/et/emerging-botcc.rules
include $RULE_PATH/et/emerging-chat.rules
include $RULE_PATH/et/emerging-ciarmy.rules
include $RULE_PATH/et/emerging-compromised.rules
include $RULE_PATH/et/emerging-current_events.rules
include $RULE_PATH/et/emerging-deleted.rules
include $RULE_PATH/et/emerging-dns.rules
我的
sed
命令用于添加
$STRING
内容,如下所示:

for f in /tmp/et/*.rules; do 
    #STRING+=`basename "$f"`$'\n'; 
    STRING+=$'include $RULE_PATH/et/'`basename "$f"`$'\n'
done
sed -i.bak 's!^#EMERGING\ THREATS\ RULESET.*$!& \n'"$STRING"'!' snort.conf
这是在查找文本
#新兴威胁规则集
,并在匹配文本后的新行中添加
$STRING

我必须将默认的
sed
分隔符更改为其他分隔符,因为默认的
/
与我的
$STRING
中的目录路径冲突。现在,问题是我从
sed
中得到一个错误,指出:

sed: -e expression #1, char 82: unterminated `s' command
我知道这一定是字符串操作的一个简单问题,或者是关于引号的问题,但是我在这里尝试了很多组合,但都没办法解决…

您使用的分隔符不正确:

sed -i.bak 's!^#EMERGING\ THREATS\ RULESET.*$/& \n'"$STRING"'!' snort.conf
                                             ^
                                             |
---------------------------------------------
看来你的问题是新线。在
sed
替换文本中不能有未转换的换行符(
$STRING
sed
scripting像shell一样使用换行符来终止命令

如果在替换文本中需要换行符,则需要在其前面加反斜杠。或者,如果您使用的是
gnu sed
,并且不关心到其他sed实现的可移植性,则可以在替换文本中用
\n
替换换行符(所有符合posix的sed都允许在正则表达式中使用该换行符,但在替换中不允许,因为它是gnu扩展)。由于嵌入的换行符位于变量中,因此这种方法不适用于您

因此,您可以按照他的答案所示进行操作,也可以使用
awk
解决方案:

awk -v patt="$STRING" '/^#EMERGING THREATS RULESET/{print $0;print patt;next}1' snort.conf >tmp && mv tmp snort.conf
这并不需要
GNU awk

好,使用这种方法:

#!/bin/bash
> _tmp
for f in /tmp/et/*.rules; do 
    echo $'include $RULE_PATH/et/'`basename "$f"`$'\n' >> _tmp
done

sed -i.bak '/^#EMERGING THREATS RULESET/r _tmp' snort.conf

它基本上将您的输出存储在一个临时文件中,并在您的搜索模式之后使用该临时文件替换sed命令中的内容。

是的,非常敏锐,但我更改了它
但它仍然不是working@sadmicrowave您收到的是相同的错误消息还是新的错误消息?@sadmove已更新答案以反映真实问题。您能显示
$STRING
的值吗?我显示了。这是所有
包含的摘录
,我认为问题在于多行变量+1来解决问题。刚刚意识到你的分数太高了。将在格林尼治时间午夜投票补偿<代码>;)非常感谢你这么体贴Jaypal!是的,我今天已经用了好几个小时了。