我有一个标记文件目录,我正试图用它来完成以下任务:
获取标记文件的文件名并将其存储在变量中
获取该变量并用存储的文件名变量替换文件中的一系列字符串
循环浏览目录中的所有文件并执行相同的操作
我很接近了,但是下面的代码将只提取第一个标记文件的文件名,并将变量应用于文件中的所有字符串。这是我目前的工作准则:
#!/bin/bash
for file in /home/user/dir/*; do
str="somestring"
filename=$(basename $file)
fn="$(echo "${filename%.*}")"
find ./ -type f -exec sed -i '' -e "s/${str}/${fn}/g" {} \;
done
假设标记文件如下所示:
123456789.md
和其他几个带有随机数字名称的.md文件。.md文件的结构类似于:
---
layout: default
date: 2010-03-28
original: /orig/somestring.jpg
thumbnail: /thumb/somestring_thumb.jpg
permalink: /images/somestring/
---
我的目标是让脚本根据.md文件本身的文件名使每个文件看起来像这样:
---
layout: default
date: 2010-03-28
original: /orig/123456789.jpg
thumbnail: /thumb/123456789_thumb.jpg
permalink: /images/123456789/
---
对编辑sed调用的最佳方法,或编写此调用的其他方法有何想法?在我的测试中,sed偶尔会返回
/home/user/dir/123456789.md
,但无论如何都要对字符串进行重命名,即使它是错误的字符串。
最佳答案
如果我理解正确,下面的方法就行了:
#!/bin/bash
for file in /home/user/dir/*; do
str="somestring"
filename=$(basename "$file")
fn=${filename%.*}
LANG=C sed -i '' -e "s/${str}/${fn}/g" "$file"
done
问题是您正在执行
find & sed
循环中的for
,这将覆盖不相关文件中的字符串。LANG=C
在sed
之前将是sed: RE error: illegal byte sequence
问题的常见解决方法。
关于linux - 遍历目录中的文件;拉出文件名以替换现有文件中的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55410387/