【发布时间】:2018-01-30 15:42:01
【问题描述】:
我正在尝试在 Freebsd 的 sed 命令中使用变量。 Freebsd 中的 sed 在 a 之后需要 \。基本上,如果文件中的特定行与模式匹配,我想附加一行。我正在使用 sed 的附加功能。
#!/usr/bin/bash
SYSLOG_SERVER="192.168.1.36"
SYSLOG_PORT="514"
syslog_conf_file="/etc/syslog.conf"
send_logs() {
logs=(messages auth.log )
send_logs[0]=`awk '(index($2, "messages") != 0) {print $1}' $syslog_conf_file`
send_logs[1]=`awk '(index($2, "auth.log") != 0) {print $1}' $syslog_conf_file`
for (( i = 0 ; i < ${#send_logs[@]} ; i++ ))
do
if [ ! -z "${send_logs[$i]}" ]; then
send_logs[i]=${send_logs[i]}" \t"@$SYSLOG_SERVER:$SYSLOG_PORT
sed "/${logs[$i]}$/a\
${send_logs[$i]} \
" $syslog_conf_file
fi
done
}
我正面临这个错误。变量打印正确,但我运行脚本的方式是错误的。我该如何解决这个问题?
root@Great# bash temp.sh
send_logs *.notice;authpriv.none;kern.debug;lpr.info;mail.crit;news.err \t@192.168.1.36:514
logs messages
sed: 1: "/messages$/a ...": command a expects \ followed by text
send_logs auth.info;authpriv.info \t@192.168.1.36:514
logs auth.log
sed: 1: "/auth.log$/a ...": command a expects \ followed by text
sed 的预期输入示例:
root@Great# sed '/messages$/a\
*.notice;authpriv.none;kern.debug;lpr.info;mail.crit;news.err @192.168.1.36:514 \
' /etc/syslog.conf
预期输出:
*.err;kern.warning;auth.notice;mail.crit /dev/console
*.notice;authpriv.none;kern.debug;lpr.info;mail.crit;news.err /var/log/messages
*.notice;authpriv.none;kern.debug;lpr.info;mail.crit;news.err @192.168.1.36:514
security.* /var/log/security
auth.info;authpriv.info /var/log/auth.log
【问题讨论】:
-
sed 并不是真正为处理变量扩展而设计的。
-
@RamanSailopal 哦,我不能解决这个问题吗?
-
请尝试向我们提供minimal reproducible example,我猜这可能是使用
a命令和变量的单个sed 调用。向我们展示您的输入和所需的输出。 -
@TomFenech 谢谢!我用示例输入和输出修改了描述,并从脚本中剪切了一些文件。
-
我想的是更像
var=foo然后在插入foo之前和之后显示文件示例。