【问题标题】:Find instance of word in files and change it to the filename在文件中查找单词的实例并将其更改为文件名
【发布时间】:2017-10-05 23:52:07
【问题描述】:

我有名为 A1.V5.76.txt 和 B5.CV.PH.txt 的文件,其中包含如下文本:

这是文件filename的名称

我想将文本中的单词文件名更改为实际的文件名(扩展名除外。)

例如,上面会写成:

这里是文件名 A1.V5.76

我已经尝试了以下代码,这些代码是我从一个旧项目中编辑和重新利用的,我将目录名称作为变量传递,但没有任何反应:

for file in *.melanie; sed -i "s/filename/$file/g"; done

对于不太好的代码,我深表歉意。我还在学习。

【问题讨论】:

  • 您在;sed 之间缺少do。你应该得到一个语法错误,而不是“什么都没有发生”。

标签: sed


【解决方案1】:

你的命令有一点问题,可以如下修改,

for file in *.melanie;do sed -i "s/filename/$file/g" $file; done

简要说明,

  • 您忘记了 for 循环中的 do 一词
  • 您忘记了sed 命令的输入文件,因此请在后面添加$file

修改这两个应该不错了。

【讨论】:

  • 糟了!谢谢!不应该在我半睡半醒的时候写代码!感谢您的帮助!
【解决方案2】:

遵循 awk 应该对您有所帮助。

awk '{sub("filename",FILENAME);print}' A1.V5.76.txt

所以上面将替换字符串“文件名”将输入文件的名称。如果您对上述命令的结果感到满意,那么您可以运行以下命令,通过执行以下操作来更改 Input_file 本身。

awk '{sub("filename",FILENAME);print}' A1.V5.76.txt > temp_file && mv temp_file A1.V5.76.txt

编辑:如果您想传递多个文件并且它们的扩展名是 *.txt,那么下面的内容可能会对您有所帮助。

awk '
FNR==1{
  if(val){
   close(val);
   close("temp_file");
   system("mv temp_file " val)
};
  val=FILENAME
}
{
  sub("filename",FILENAME);
  print > "temp_file"
}
END{
  if(val){
   close("temp_file");
   system("mv temp_file " val)
}
}
' *.txt

【讨论】:

  • @MelanieShebel,你应该只传递任何文件名,如果它有字符串文件名,那么它应该会飞。
  • @MelanieShebel,检查我的 EDIT 解决方案,它将处理目录中的所有 .txt 文件,请告诉我。
猜你喜欢
  • 2015-07-07
  • 2013-12-12
  • 2017-07-23
  • 1970-01-01
  • 2022-01-07
  • 2012-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多