3

我有两个文件:domainList 和 config.cnf。domainList 文件只包含一个域列表,如下所示:

facebook.com
yahoo.com
youtube.com

config.cnf 是一个配置文件,具有相同的列表,但格式略有不同。我需要编写一个脚本,在更新列表时更新配置文件。每当更新第一个列表时,我都可以执行 bash 脚本。这是配置文件中列表的格式...

*other config options/entries*
[my_list]
WWW.1 = facebook.com
WWW.2 = yahoo.com
WWW.3 = youtube.com
EOF

因此,如果删除 yahoo 并将 ebay 添加到 domainList 中并且我运行我很酷的 bash 脚本,我需要像这样更新配置文件......

*other config options/entries*
[my_list]
WWW.1 = facebook.com
WWW.2 = youtube.com
WWW.3 = ebay.com
EOF

使事情复杂化(稍微)域可以有子域和通配符(即 news.google.com 或 *.google.com)。任何关于如何实现这一点的想法将不胜感激!我该怎么做才能不让数字完全失控?它可能只需要每次清除列表并重新生成它,对吧?

谢谢!

电动汽车

4

4 回答 4

6

这是一个简单的脚本来实现这一点:

# delete all lines after [my_list]
sed -i '/my_list/q' config.cnf

# add the domain list to the bottom of the config
awk '{print "WWW." NR " = " $0}' domainList >> config.cnf

该脚本可以使用 awk 或 sed 编写为单行脚本,但上述方法(希望)在其方法中非常清楚。

于 2012-06-14T20:25:13.663 回答
0
#!/usr/bin/env bash

FIN=domainList
FOUT=config.cnf

echo "config.cnf template header" > $FOUT
awk '{ print "WWW." FNR " = " $1 }' $FIN >> $FOUT
echo "config.cnf template footer" >> $FOUT
于 2012-06-14T20:21:54.207 回答
0

这是 awk 中的一个单行代码

awk '
BEGIN{var=1}
NR==FNR{a[NR]=$1;next} 
var && /WWW/{var=0; for (x=1;x<=length(a);x++) {print "WWW." x " = " a[x]};next}
!var && /WWW/ {next}
1' domainList config.cnf > config.cnf_new

测试:

$ cat domainList 
facebook.com
youtube.com
ebay.com

$ cat config.cnf
*other config options/entries*
[my_list]
WWW.1 = facebook.com
WWW.2 = yahoo.com
WWW.3 = youtube.com
EOF

$ awk ' 
BEGIN{var=1}
NR==FNR{a[NR]=$1;next} 
var && /WWW/{var=0; for (x=1;x<=length(a);x++) {print "WWW." x " = " a[x]};next}
!var && /WWW/ {next}
1' domainList config.cnf
*other config options/entries*
[my_list]
WWW.1 = facebook.com
WWW.2 = youtube.com
WWW.3 = ebay.com
EOF
$ 
于 2012-06-14T21:15:24.733 回答
0

带有一点 awk 的 bash

while IFS= read -r line; do
  echo "$line"
  if [[ $line = '[my_list]' ]]; then
    awk '{print "WWW." NR " = " $0}' domainList
    echo "EOF" # is this literally in your config file?
    break
  fi
done < config.cnf > tmpfile && mv tmpfile config.cnf
于 2012-06-14T22:11:57.630 回答