sed 명령을 사용하여 대체할 문자열로 파일 이름과 경로를 사용

sed 명령을 사용하여 대체할 문자열로 파일 이름과 경로를 사용

나는 다음과 같은 상황을 처리하려고 노력하고 있습니다. 폴더 트리에 확장자를 가진 많은 파일(100개 이상)이 있고 .html해당 파일 안에는 파일 이름인 문자열이 있습니다. 예를 들어 다음 파일이 있습니다.

file1.htmlsubfolder1/subfolderA/파일 어딘가에 문자열이 포함되어 있는 위치에 있습니다 file1.html.

file2.htmlsubfolder1/subfolderB/파일의 어딘가에 문자열이 포함되어 있는 위치file2.html

file3.htmlsubfolder2/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

findand를 사용하여 문자열을 바꾸는 방법을 알고 있습니다 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

관련 정보