【发布时间】:2021-07-28 15:22:50
【问题描述】:
更新:
我已经尝试了 markp-fuso 的答案,它就像一个魅力
我开始感到沮丧,因为我不是 bash/sed 之类的日常用户。
起点:
我有许多包含许多源文件的子文件夹 (.c,.cpp,.cxx)。
在项目文件 (.vcxproj) 中引用这些源文件进行编译。
我想做的事:
我想查找所有包含字符串#import 的源文件。然后我想找到引用这些源文件的所有项目文件。
然后我想在这些项目文件中就地编辑这些引用的所有出现
例如<Include="folder/file.cpp"/> -> <Include="folder/file.cpp" Attribute="Value"/>
我尝试过的:
egrep -lir --include=*.{c,cpp,cxx} "(#import)" ./e3 | xargs -L 1 basename | egrep -ir --include=*.vcxproj -f - ./e3 | sed 's/:/ /g'
生成这样的列表:
./src/base/base.vcxproj <ClCompile Include="Folder1\Folder1File1.cpp" />
./src/mod/mod.vcxproj <ClCompile Include="Folder2\Folder2File1.cpp" />
./src/ext/ext.vcxproj <ClCompile Include="Folder3\Folder3File1.cpp" />
于是我尝试了
egrep -lir --include=*.{c,cpp,cxx} "(#import)" ./e3 | xargs -L 1 basename | egrep -ir --include=*.vcxproj -f - ./e3 | sed 's/:/ /g' | awk '{ sed -iE 's/($2,$3)/\1 Attribute="Value"/g' }'
哪些错误发生了
bash: syntax error near unexpected token `('
我尝试了一个带有 shell 脚本的解决方案,但它也不起作用,我不知道是否以及如何解决上述错误消息。我愿意接受任何解决方案,只要它在 bash 中运行,甚至可能比我想出的更恶心。
【问题讨论】:
-
awk '{ sed -iE ... }'-- ...错误,什么?awk需要 awk 源代码。sed不是 awk 语言中的有效语句或函数。 -
明确地说,awk 和 sed 并不是这项工作的最佳选择。最好使用支持 XML 的工具(XMLStarlet 等),或包含 XML 库的语言(Python 有很多标准库选项,ElementTree 是最好的)。
-
...好吧,你得到一个 bash 错误而不是一个 awk 错误,因为你的单引号字符串中有一个单引号,所以它不会全部被 awk 解析并继续回到 bash 正在查看的上下文中。
-
...也就是说,“bash 或 shell 脚本”是模棱两可的。我的意思是,awk 是一种独立于 bash 的编程语言,就像 Python 一样。您可以将 Python 放入 bash 脚本中,就像将 awk 放入 bash 脚本中一样容易。如果 awk 没问题,那么您肯定不会要求 100% 纯 bash 解决方案。
-
您真的不想“就地”替换文本。磁盘便宜。使用您想要的更改编写一个新的目录树。尝试“就地”更改文件是数据损坏的秘诀。请注意,我在引号中写了“就地”,因为像
gnu-sed这样的工具及其错误命名的就地选项不会就地编辑文件;他们创建新文件。
标签: bash sed substitution