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

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

관련 정보