0

我有一堆文件看起来像这样:

1x 4b
2x 4b
3x 4b

.subckt test xxx

1t 4b
2t 4b
2x 4b

所以我的问题是,我怎样才能用4b.subckt test xxx”替换8b并覆盖原始文件。并递归地对该文件夹中的所有文件执行此操作。

4

3 回答 3

3

我会这样做:

$ sed -e '1,/^\.subckt test xxx$/b' -e 's/ 4b/ 8b/'

这会跳过 ( b) 进一步处理,直到遇到特征线。之后,该s命令将在其余行中执行替换。

要覆盖原始文件,请使用-i,可选择使用备份文件后缀:-i.bak.

您可以将多个文件(在一个文件夹中)传递给 sed;find如果您想递归到子目录,请使用例如和搜索解决方案xargs

于 2013-08-20T19:03:48.363 回答
0

使用awk

awk '/.subckt test xxx/ {f=1;print;next} f && $2=="4b" {$2="8b"} 1' orgfile >tmpfile ; mv tmpfile orgfile
于 2013-08-20T20:21:03.663 回答
0
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来避免显式指定临时文件名。

于 2013-08-20T20:26:35.257 回答