regex 使用部分输入匹配作为目录中所有文件的输出来替换字符串

hgtggwj0  于 2023-04-07  发布在  其他
关注(0)|答案(1)|浏览(115)
  • 我想递归地用"foo/bar.h"替换<foo/bar.h>的示例(用"替换<,用"替换>)。
  • 匹配序列可能有不同的深度,但根总是从<foo开始。例如,<foo/baz/bar.h>也应该被替换。

这就是我目前所拥有的,但是它缺少在输出中使用中间匹配任何部分.*的能力(导致"foo/.*"明显不正确)

grep -rl "\<foo\/.*>" ./ | xargs sed -i 's/<foo\/.*>/\"foo\/.*\"/g'

我接近了,但是需要一种方法来扩展输出中的.*,使其实际上是输入中发现的匹配,而不是文字字符串.*
示例

  • ./dir1/a.cc包含以下行:#include <foo/bar.h>,更换后应包含#include "foo/bar.h"
  • ./dir1/dir2/b.h包含以下行:#include <foo/bar/baz.h>,更换后应包含#include "foo/bar/baz.h"
ss2ws0br

ss2ws0br1#

引用this的帖子:
grep -rl "\<foo\/.*>" ./ | xargs sed -i -E 's/<foo\/(.*)>/\"foo\/\1\"/g'

  • 第一部分中的括号定义了可以在第二部分中重用的组(实际上是字符串
  • 第二部分中的\1、\2等是对第一部分中捕获的第i个组的引用(编号从1开始)

相关问题