我有一堆文件看起来像这样:
1x 4b
2x 4b
3x 4b
.subckt test xxx
1t 4b
2t 4b
2x 4b
所以我的问题是,我怎样才能用4b
“ .subckt test xxx
”替换8b
并覆盖原始文件。并递归地对该文件夹中的所有文件执行此操作。
我会这样做:
$ sed -e '1,/^\.subckt test xxx$/b' -e 's/ 4b/ 8b/'
这会跳过 ( b
) 进一步处理,直到遇到特征线。之后,该s
命令将在其余行中执行替换。
要覆盖原始文件,请使用-i
,可选择使用备份文件后缀:-i.bak
.
您可以将多个文件(在一个文件夹中)传递给 sed;find
如果您想递归到子目录,请使用例如和搜索解决方案xargs
。
使用awk
:
awk '/.subckt test xxx/ {f=1;print;next} f && $2=="4b" {$2="8b"} 1' orgfile >tmpfile ; mv tmpfile orgfile
find /dir -type f -print |
while IFS= read -r file
do
awk 'f{$2="8b"} /\.subckt test xxx/{f=1} 1' "$file" > /usr/tmp/tmp$$ &&
mv /usr/tmp/tmp$$ "$file"
done
以上不适用于包含换行符的文件名,因此如果您遇到这种情况,请告诉我们以获得不同的解决方案(提示:xargs)。
如果您愿意,可以使用最新版本的 GNU awk-i inplace
来避免显式指定临时文件名。