【问题标题】:using sed to replace a string in all files of a directory使用 sed 替换目录下所有文件中的字符串
【发布时间】:2018-06-25 17:06:01
【问题描述】:

我正在尝试查找并替换所有出现的这种情况:

 #include <boost

用这个:

#include </home/pi/Desktop/boost_1_66_0/boost

为了图书馆的工作。这是我想出的:

sed -i 's/#include <boost/#include <\/home\/pi\/Desktop\/boost_1_66_0\/boost/g' *

但是给了我这个:

sed:无法编辑构建:不是常规文件

我是逃错了“/”还是#问题所在?

【问题讨论】:

  • 我希望搜索该目录及其所有子目录中的所有文件
  • 你能列出这应该处理的文件吗?我对“构建”的来源特别感兴趣。它可能是文件名之一吗?由于错误消息抱怨它不是常规文件,因此该信息也会有所帮助。也许你可以提供ls -l的输出。
  • 我正在尝试构建openvibe 源代码,它可能是其中的一个脚本,因为另一个答案完成了这项工作

标签: regex linux sed terminal


【解决方案1】:

看起来build 是一个目录,您不能在目录上运行sed。如果您的目录树只有一层,则一种选择是使用最后一个参数*/* 而不是*。对于任意深度的目录结构,更有效的方法是使用find 查找所有文件并对其运行sed

find . -type f -exec sed -i 's/from/to/' {} \;

这使用find 从当前目录开始并递归地下降目录树。对于它找到的每个常规文件 (-type f),它将运行赋予 -exec 选项的命令。它将{} 替换为它找到的文件。

【讨论】:

  • 考虑使用{} +,这样您就不会为每个文件调用sed
  • @PesaThe 谢谢我不知道那个选项。很高兴不必为此使用xargs。我通常不会为此烦恼,因为我发现如果多次调用 sed 的成本是显而易见的,我也更有可能遇到命令行长度限制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 2011-08-10
  • 2011-11-19
  • 2017-11-14
  • 1970-01-01
  • 1970-01-01
  • 2021-03-01
相关资源
最近更新 更多