각 줄이 두 개의 변수로 읽혀지도록 두 개의 열이 있는 파일을 스크립트로 읽는 방법

각 줄이 두 개의 변수로 읽혀지도록 두 개의 열이 있는 파일을 스크립트로 읽는 방법

두 개의 열이 있는 파일이 있습니다.

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 파일이 포함되어 있나요?

    이 모든 파일의 백업이 있습니까? 아무것도 잃고 싶지 않기 전에 정말로 이 일을 해야 합니다.

관련 정보