와일드카드 *를 (bash?) 스크립트에 전달하세요.

와일드카드 *를 (bash?) 스크립트에 전달하세요.

중간 크기의 텍스트 파일 모음에서 "@n", "@R" 등과 같은 모든 색상 코드를 제거하고 싶습니다.

그래서 "remove_cc"라는 파일에 다음과 같이 썼습니다.

sed -ie 's/@r//g' $1
sed -ie 's/@g//g' $1
sed -ie 's/@y//g' $1
sed -ie 's/@b//g' $1
sed -ie 's/@m//g' $1
sed -ie 's/@c//g' $1
sed -ie 's/@n//g' $1
sed -ie 's/@R//g' $1
sed -ie 's/@G//g' $1
sed -ie 's/@Y//g' $1
sed -ie 's/@B//g' $1
sed -ie 's/@M//g' $1
sed -ie 's/@C//g' $1
sed -ie 's/@N//g' $1
sed -ie 's/@W//g' $1
sed -ie 's/@K//g' $1

어쨌든 다음과 같이 사용하면 스크립트가 완벽하게 작동합니다. ./remove_cc file.txt

그러나 많은 txt 파일이 포함된 폴더에 들어가서 ./remove_cc *.txt그 폴더에서 스크립트를 실행하려고 하면 아무 작업도 수행되지 않습니다. ./remove_cc *또한 유효하지 않습니다.

이 문제를 해결하여 작동할 수 있는 방법이 있습니까?

답변1

를 입력하면 ./remove_cc *셸은 이를 로 변경 ./remove_cc file1.txt file2.txt file3.txt etc하고 그런 식으로 스크립트를 실행합니다. 스크립트는 $1첫 번째 매개변수(file1.txt)만 확인합니다.

가장 일반적인 접근 방식은 각 매개변수를 차례로 반복하는 것입니다. 루프오버 "$@"에 사용할 수 있는 모든 인수 목록으로 확장됩니다 .for

for n in "$@" ; do
    sed -ie 's/@r//g' "$n"
    ...
done

이 특별한 경우에는 sed여러 파일 이름을 사용하므로 다음을 단순화할 수 있습니다.

sed -ie 's/@r//g' "$@"

쉘 스크립트를 작성할 때 따옴표에 주의하는 것이 중요합니다. 예를 들어, 따옴표가 없으면 스크립트는 이름이 My Text File.txt.

답변2

그냥 사용

 for x in *
 do
     ./remove_cc $x
 done

그런데, 모든 sed를 한 줄에 결합할 수 있습니다

sed -i \
    -e 's/@r//g' -e 's/@g//g' -e 's/@y//g' -e 's/@b//g' \
    -e 's/@m//g' -e 's/@c//g' -e 's/@n//g' -e 's/@R//g' \
    -e 's/@G//g' -e 's/@Y//g' -e 's/@B//g' -e 's/@M//g' \
    -e 's/@C//g' -e 's/@N//g' -e 's/@W//g' -e 's/@K//g' \
    $1

세미콜론을 사용하여 sed 명령을 연결할 수도 있습니다.

sed -i -e 's/@r//g;s/@g//g;s/@y//g' $1

아니면 그냥 문자 목록을 사용하세요

sed -i -e s/@[rgbcmyRGBCMY]//g $1

또는

 sed -i -e s/@[rgbcmyRGBCMY]//g *

(편지를 모두 치웠는지 꼭 확인해주세요)

답변3

. 또는 인용 부호 "$@"대신 사용하십시오 .$1

$ bash -c 'echo $1' 'some command' '*'
file1 file2
$ bash -c 'echo "$@"' 'some command' *
file1 file2

답변4

스크립트를 변경하고 싶지 않다면 다음 명령을 실행하여 xargs를 사용할 수도 있습니다(해당 스크립트가 있거나 플랫폼에서 사용 가능한 경우).

ls *.txt | xargs -L1 ./remove_cc

xargs는 stdin을 가져와 실행할 명령의 명령 인수로 변환하는 유틸리티입니다. 단일 실행에 사용되는 입력 라인 수를 제한하는 -L 플래그가 있습니다.

관련 정보