【问题标题】:sed: how can I replace an identifier/key word in a file with a file name?sed:如何用文件名替换文件中的标识符/关键字?
【发布时间】:2021-12-25 00:07:03
【问题描述】:

我有一个父目录,其中包含一系列子目录,名为:

1
2
3
4 # <-- This one is used in an example below.
...

每个子目录都包含一个名为input 的文件和一个名为data 的孙子目录。在“data”中是一个通过将子目录名称乘以 1000 命名的文件。例如:

Parent directory / daughter directory #4 / input

Parent directory / daughter directory #4 / data / 4000.dat

这是我需要做的事情: 在每个input 文件中,将术语“old_file_name”替换为相应data 目录中的文件名。所以在上面的例子中,我需要找到术语“old_file_name”并将其替换为“4000.dat”。

这是我尝试过的,并附有我想要对每个 input 文件执行的操作的注释:

find_replace_old_file_name="old_file_name"

i=$((daughter)); # This is the directories called "1," "2," "3," etc.
daughter2=$((1000*daughter)) # Multiply by 1000 to get correct filename in /data.
l=$(sed "${i}q;d" parent/$daughter/data/$daughter2.dat) # Get filename of file in /data.
echo ${l%}

find parent/${i} -type f -exec sed -i -e "s/${find_replace_old_file_name}/${l}/g" {} +

我在“l=”步骤做错了,因为在每个input 文件中,术语old_file_name 被替换为.dat 文件的内容,而不是它们的名称。所以在上面的例子中,我希望4000.dat 替换相应的input 文件中的old_file_name,但我得到的是4000.dat. 的内容有谁知道我做错了什么?

【问题讨论】:

    标签: file sed replace file-io find


    【解决方案1】:

    我不确定回答自己问题的礼仪,但我想我会发布一个解决方案,以防它对其他人有用。

    我遇到了这个问题 (Getting "Permission denied" on dirname and basename) 并修改了答案以替换我的“l=”行:

    l=$(basename parent/$daughter/data/*.dat)
    

    它解决了我的问题。我得到了文件的名称,现在可以将其放入input 文件中。

    【讨论】:

      猜你喜欢
      • 2020-01-30
      • 1970-01-01
      • 1970-01-01
      • 2017-11-14
      • 1970-01-01
      • 2015-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多