두 개의 열이 있는 파일이 있습니다.
cat test.txt
100 2007
FFF 1993
7E7 1994
4BB 1995
각 행을 스크립트에 입력하고 두 열을 별도의 변수로 할당하여 서로 다른 루프를 통해 실행한 후 다음 행으로 이동할 수 있도록 해야 합니다.
파일 목록이 길고 각 쌍에 대해 찾기 및 바꾸기 기능을 수행해야 합니다. 컬렉션을 이미 계획한 연도로 변환하고 있습니다.
내 스크립트는 다음과 같습니다.
SET=$1
YEAR=$2
for i in `ls` ; do
sed -i "" 's/"$1"/"$2"/g' $i;
done
test.txt에서 개행 루프 스크립트를 사용하는 방법을 모르겠습니다.
답변1
read
공백(파일에서 사용하는 것과 유사함)을 기준으로 줄을 분할 할 수 있습니다 . 이 같은:
while read set year; do
DoStuffWith "$set" "$year"
done <test.txt
기타 참고사항:
위의 예에서는 소문자 변수 이름을 사용했습니다. 특별한 의미를 지닌 대문자 이름이 많이 있으며, 이들과의 충돌을 피하는 가장 안전한 방법은 소문자 또는 대소문자 혼합 변수를 사용하는 것입니다(단,생각하다특별한 의미).
출력을 반복하지 마십시오
ls
, 어떤 경우에는 이상한 구문 분석을 피하기 위해 . 를 사용for i in *; do
하고 큰따옴표로 묶으십시오.$i
sed
을 사용하는 경우에는 이 작업을 수행할 필요가 없습니다sed -i "" 'whatever' *
.sed
명령 에서 작은따옴표로 묶인 문자열 내에서 변수 대체와 큰따옴표를 사용하려고 시도하는 것 같지만 작동하지 않습니다. 큰따옴표가 실제로 검색/바꾸기 문자열의 일부가 되는 것을 원하지 않으면 다음을 대신 사용하세요.sed -i "" "s/$set/$year/g" *
문자열 검색 및 바꾸기에 리터럴 큰따옴표를 사용하려면 이스케이프 처리하세요.
sed -i "" "s/\"$set\"/\"$year\"/g" *
파일을 반복하고 각 줄마다 각 파일을 반복하여 문자열을 바꾸려는 것 같습니다. 왜 달리지 않습니까?모두대안? 즉,
sed
명령을 사용하여 실행하고s/100/2007/g
, 다시 명령을 사용하고s/FFF/1993/g
, 다시 명령을 사용하는 대신... 명령을 한 번 실행하는 것은 어떨까요s/100/2007/g; s/FFF/1993/g; s/7E7/1994/g; ...
?sed
다음과 같은 루프로 명령을 작성 해야 합니다 .sedCommand="" while read set year; do sedCommand+="s/$set/$year/g; " done <test.txt sed -i "" "$sedCommand" *
마지막으로 이와 같은 글로벌 대안이 걱정스럽습니다. "2007"로 바꿔야 하는 경우를 제외하고는 어떤 파일에도 "100"이 나타나지 않는다는 것이 확실합니까? test.txt 파일이 포함되어 있나요?
이 모든 파일의 백업이 있습니까? 아무것도 잃고 싶지 않기 전에 정말로 이 일을 해야 합니다.