我有一堆文件看起来像这样:
1x 4b
2x 4b
3x 4b
.subckt test xxx
1t 4b
2t 4b
2x 4b
所以我的问题是如何将4b
替换为.subckt test xxx
并8b
并覆盖原始文件。并递归地为该文件夹中的所有文件执行此操作。
答案 0 :(得分:3)
我会这样做:
$ sed -e '1,/^\.subckt test xxx$/b' -e 's/ 4b/ 8b/'
这会跳过(b
)进一步处理,直到遇到特征线。之后,s
命令将在剩余的行中执行替换。
要覆盖原始文件,请使用-i
,可选择使用备份文件后缀:-i.bak
。
您可以将多个文件(在文件夹中)传递给sed;如果你想要递归到子目录,使用例如搜索解决方案find
和xargs
。
答案 1 :(得分:0)
使用awk
:
awk '/.subckt test xxx/ {f=1;print;next} f && $2=="4b" {$2="8b"} 1' orgfile >tmpfile ; mv tmpfile orgfile
答案 2 :(得分: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
来避免显式指定临时文件名。