동적 참조 파일 이름

동적 참조 파일 이름

단일 디렉토리에서 각 파일의 첫 번째 줄을 파일 이름으로 바꾸고 싶습니다. 각 파일의 첫 번째 줄은 "TestRelation"입니다. 파일 이름으로 바꾸고 싶습니다.

나는 그것을 perl -pi -w -e 's/SEARCH_FOR/REPLACE_WITH/g;' *.txt모든 파일을 탐색하는 데 사용할 수 있다는 것을 알고 있습니다. 하지만 파일 이름에서 "REPLACE_WITH"를 동적으로 변경하는 방법은 무엇입니까?

답변1

노력하다:

perl -i.bak -wpe 's/SEARCH_FOR/$ARGV/g' *.txt

$ARGV를 읽을 때 현재 파일의 이름을 포함합니다 <>.

스위치를 사용하기 때문에 -i걱정할 필요가 없습니다.보안 영향perl-n또는 스위치를 사용하여 실행할 때 -p.

답변2

"여기 문서"가 있는 쉘 스크립트는 이를 훌륭하게 처리합니다.

#!/bin/bash
for NAME in t?
do
ex -s $NAME << END_EDITS
1s/TestRelation/$NAME/
w!
q
END_EDITS
done

파일 이름이 무엇인지 잘 모르겠으므로 "t1", "t2", "t3" 등을 파일 이름으로 선택했습니다. 필요에 따라 파일 이름을 생성해야 합니다.

"for" 루프는 NAME루프를 통과할 때마다 파일 이름 값을 쉘 변수에 제공합니다. bash위 스크립트를 실행하는 인스턴스는 ex각 파일 이름에 대한 편집기를 호출하고 여기에 몇 줄의 입력을 제공합니다. ex 명령은 1s/TestRelation/$NAME/인스턴스로 확장되어 bash"$NAME" 부분을 파일 이름으로 바꿉니다.

END_EDITS줄 시작 부분에 공백 없이 닫는 "document here"(이 경우) 태그가 있어야 합니다 .

답변3

이런 식으로 시도해 볼 수 있습니다.

for i in `ls *.sh`; do echo "$i">>$i.new; cat $i.new $i >>$i.new;done

주요 기능은 파일을 나열하고 파일 이름을 저장하는 것입니다. 이 이름을 새 파일에 쓰고 원본 파일과 함께 사용하십시오. 원하는 경우 .new 파일을 원래 파일 이름으로 이동할 수도 있습니다. 가장 우아한 옵션은 아니지만 작동합니다.

답변4

쉘에서 이 작업을 수행하려면 find명령을 사용하여 파일을 나열한 다음 basename명령을 사용하여 파일 이름을 가져오고 sed문자열을 다음으로 바꾸십시오.

for i  in $(find . -type f); do fname=$(basename $i); sed -i "s/TestRelation/${fname}/" $fname; done

basename, 이것은 필요하지 않습니다. 검색 중인 특정 디렉토리에만 파일이 있다고 확신하는 경우 find다음을 사용할 수 있습니다 .ls

관련 정보