%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%97%90%20%EC%99%80%EC%9D%BC%EB%93%9C%EC%B9%B4%EB%93%9C%20*%20%EC%A0%84%EB%8B%AC.png)
적당히 큰 크기의 텍스트 파일 모음에서 '@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 플래그가 있습니다.