sed:如何用文件名替换文件中的标识符/关键字?

Posted

技术标签:

【中文标题】sed:如何用文件名替换文件中的标识符/关键字?【英文标题】:sed: how can I replace an identifier/key word in a file with a file name? 【发布时间】: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 "$iq;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. 的内容有谁知道我做错了什么?

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

以上是关于sed:如何用文件名替换文件中的标识符/关键字?的主要内容,如果未能解决你的问题,请参考以下文章

如何用sed命令替换一行中的某个字符串

Bash 脚本:如何用 sed 替换 package.json 中的文本

如何用 sed 的变量替换单引号字符串? [复制]

如何用sed中的另一个路径替换路径?

如何用python查找和替换json文件中的特定字符串

sed:替换一行的一部分