중간 크기의 텍스트 파일 모음에서 "@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 플래그가 있습니다.