【发布时间】:2020-04-22 17:15:18
【问题描述】:
我在使用 sed 替换文件中的行时遇到了一些问题。
我想要的是使用正则表达式将所有出现的#include <path/to/my/file.h> 与#include "file.h" 切换出去。
当我用 echo 测试它时,它会给出我正在寻找的输出:
echo "#include <path/to/my/file.h>" | sed -E 's/^(#include.*[\/<])([^\/\<]*\.h)(>)$/#include \"\2\"/g'
但是当我使用包含#includes 的文件运行它时,它什么也没有改变。我觉得我已经尝试了所有可以在网上找到的东西,但没有任何区别
这是我尝试更改文件中的行时使用的行:
sed -E -i '' 's/^(#include.*[\/<])([^\/\<]*\.h)(>)$/#include \"\2\"/g' /path/to/my/file.h
编辑: 通过在正则表达式语句的开头和结尾删除 ^ 和 $ 来修复
【问题讨论】:
-
错误信息是什么?
-
将
‘’替换为''。 -
我认为你应该删除''
-
您能分享您的源文件(#include)以便我们重现吗?
-
如果您的换行符让您感到困惑,您可以尝试删除 sed 替换左侧开头的 ^ 和结尾的 $:
sed -E 's/(#include.*[\/<])([^\/\<]*\.h)(>)/#include \"\2\"/g'它不应该导致额外的行会受到影响,除非您有带有#include 的数据字符串。