我有一个问题,这是非常相似的那些线程:
Linux: How to replace all text between two lines and substitute it with the output of a variable using sed?
how to replace all lines between two points and subtitute it with some text in sed
在我的场景中,我有一个模板文件,如下所示:
...
some code
...
// BEGIN CODE1
// END CODE1
...
some code
...
// BEGIN CODE2
// END CODE2
...
some code
...
目标是根据需要更新CODE 1或CODE 2之间的内容,保留这些注解以供将来更新(阅读脚本将在cron作业中每天更新)。
因为我在FreeBSD上,我的sed没有像Linux那样的参数b或p,有人能告诉我如何归档它吗?
对于CODE 1,基本上将存储更新某些包含文件的路径。
试过这个:
#!/bin/sh
directory="/path/to/list/files"
for file in "$directory"/*.txt
do
if [ -f "$file" ]; then
content=$(sed -n '/\/\/ BEGIN CODE1/{:a;N;/\/\/ END CODE1/!ba;p}' "$file")
sed -i '' '/\/\/ BEGIN/,/\/\/ END/{//!c\
INCLUDE /tmp/test.txt
}' "/root/replace.txt"
fi
done
但得到了这个错误:
sed: 1: "/\/\/ BEGIN/{:a;N;/\/\/ ...": unexpected EOF (pending }'s)
CODE 1的期望输出为:
...
some code
...
// BEGIN CODE1
$INCLUDE "/usr/local/etc/namedb/keys/domain.com/ksk.key"
$INCLUDE "/usr/local/etc/namedb/keys/domain.com/zsk.key"
// END CODE1
...
some code
...
// BEGIN CODE2
// END CODE2
...
some code
...
但它需要是动态的,每次cron作业运行时都会放一个新的路径。
FolderKeys="/usr/local/namedb/keys"
FolderSites="/usr/local/etc/namedb/working"
declare -a Sites=( $(ls /$FolderSites | grep '.db$' | sed 's/.db$//') )
for Site in "${Sites[@]}"
do
ls -la $FolderJail$FolderKeys/$Site/*.key
done
真实的使用场景:
我将有一个Cron作业检查$FolderKeys每天一次,并每天更新内容之间:
/开始DNSSEC代码
//结束DNSSEC代码
在文件/usr/local/etc/namedb/working/domain. com. db上
这就是为什么我需要使用sed或其他工具来保留注解,以便只替换内部的内容:
/开始DNSSEC代码
//结束DNSSEC代码
对于每个域,不更改命名区中的其他文本。
1条答案
按热度按时间wz1wpwve1#
FreeBSD sed对待标签的方式与其他sed略有不同。它们延伸到行尾,并且不以
;
终止。因此,在编写程序时使用换行符而不是;
: