使用文件名和路径作为要使用 sed 命令替换的字符串

使用文件名和路径作为要使用 sed 命令替换的字符串

我正在尝试处理以下情况。我在文件夹树中有许多带有扩展名的文件(超过 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

相关内容