使用 sed 在单行上进行多次替换

使用 sed 在单行上进行多次替换

我想扫描整个文件树并用两个匹配项对任何行进行两次替换,即:

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,%sbcm_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

相关内容