(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

./remove_cc *.txt그러나 스크립트를 실행하려는 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 플래그가 있습니다.

관련 정보