我想扫描整个文件树并用两个匹配项对任何行进行两次替换,即:
printf("Hello WORLD! %s, %d\n",bcm_errstr(rv),var);
dprintf("kjhgjkhfkhgfjgd %s\n",bcm_errstr(rv));
应该成为
printf("Hello WORLD! %d, %d\n",rv,var);
dprintf("kjhgjkhfkhgfjgd %d\n"rv);
我尝试了以下操作但没有成功(sed.c
我的测试文件包含与查询匹配的两行):
p$ grep printf | grep "%s" | grep -rl bcm_errmsg\(rv\) sed.c | xargs sed -i -e 's/%s/%d/' -e 's/bcm_errstr\(rv\)/rv/'
我使用grep
而不是find
因为文件名未知但是我正在查看文件内容。
内容sed.c
:
$ cat sed.c printf("kjhlkjhlkjh%dkjhgljhglj\n",bcm_errmsg(rv));
dprintf("HELLO WORLD %d %d\n",test,bcm_errmsg(rv));
即我只想将两个sed
替换应用于其中包含printf
,%s
和bcm_errstr(rv)
的行。
答案1
您可以使用find
递归方式获取文件,然后sed
进行内联更改。如果我正确理解你的目标,这应该有效:
find . -print0 | xargs -0 sed -i 's/%s/%d/g; s/bcm_errstr(rv)/rv/g;'
笔记:这可能比您想要的更匹配,但您列出的目标行为非常有限。您需要调整查找部分以仅过滤您要定位的文件。
答案2
sed -e '/%s/{/bcm_errmsg(rv)/{' -e 's//rv/;s/%s/%d/' -e '}' code.c
假设要更改的内容是恒定的,即 bcm_errmsg(rv) => rv 始终。
我喜欢这样;这使得代码成为准自文档化的。
sed -e '
/^d\{0,1\}printf(/!b
/%s/{
/bcm_errms(rv)/{
s//rv/
s/%s/%d/
}
}
' code.c