shell 如何替换两个注解之间的所有行,并用sed中的一些文本替换它

toe95027  于 2023-06-24  发布在  Shell
关注(0)|答案(1)|浏览(150)

我有一个问题,这是非常相似的那些线程:
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那样的参数bp,有人能告诉我如何归档它吗?
对于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代码
对于每个域,不更改命名区中的其他文本。

wz1wpwve

wz1wpwve1#

FreeBSD sed对待标签的方式与其他sed略有不同。它们延伸到行尾,并且不以;终止。因此,在编写程序时使用换行符而不是;

# ...
content=$(
    sed -n '
        /\/\/ BEGIN CODE1/{
            :a
            N
            /\/\/ END CODE1/!ba
            p 
        }
    ' "$file"
)
# ...

相关问题