我正在尝试处理以下情况。我在文件夹树中有许多带有扩展名的文件(超过 100 个).html
,在这些文件中我有一个字符串,即文件名。例如我有以下文件:
file1.html
位于subfolder1/subfolderA/
文件中包含字符串的某个位置file1.html
。
file2.html
位于subfolder1/subfolderB/
文件中包含该字符串的某个位置file2.html
file3.html
位于subfolder2/subfolderC/
文件中包含字符串的某个位置file3.html
。
等等。
基本上,我想遍历整个树结构,找到与文件名相同的字符串,并将其替换为路径+文件名,剥离.html
.
因此,在上面的例子中,我想替换:
在文件中
file1.html
:file1.html
用。。。来代替subfolder1/subfolderA/file1
在
file2.html
:file2.html
用。。。来代替subfolder1/subfolderB/file2
在 file3.html 中:
file3.html
用。。。来代替subfolder2/subfolderC/file3
我知道如何使用find
和替换字符串sed
。我使用了以下命令:
find . -type f -name \*.html -exec sed -i.bak 's|<old string>|<new string>|g' {} +
但是,在这种情况下,“旧字符串”和“新字符串”需要进行硬编码。
我怎样才能实现上述目标
“旧字符串”= 文件名 + 文件扩展名
“新字符串”=路径+文件名-文件扩展名
任何帮助将不胜感激。
答案1
恐怕你无法单独完成你指定的find
事情exec
。尝试将管道find
的结果放入一个小循环中while
:
find . -type f -name \*.html | while read PN; do sed "s|${PN##*/}|${PN%.*}|g" "$PN"; done
答案2
测试并运行良好
#!/bin/bash
echo "enter the input"
read p
cd $p
echo "enter the file"
read f
if [[ -f $p/$f ]]
then
echo "file exsists"
grep -io "$f" $p/$f >/dev/null
if [[ $? == 0 ]]
then
r=`echo $f | sed "s/\.txt//g"`
echo $r
awk -v f="$f" -v r="$r" '{gsub(f,r,$0);print }' $f
fi
fi