匹配后替换字符串

时间:2013-08-20 18:40:42

标签: sed awk cat

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

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

.subckt test xxx

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

所以我的问题是如何将4b替换为.subckt test xxx8b并覆盖原始文件。并递归地为该文件夹中的所有文件执行此操作。

3 个答案:

答案 0 :(得分:3)

我会这样做:

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

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

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

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

答案 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来避免显式指定临时文件名。