sed를 사용하지 않고 vim(검색 및 바꾸기) 명령을 사용하여 스크립트에서 여러 문자열을 검색하고 바꾸시겠습니까?

sed를 사용하지 않고 vim(검색 및 바꾸기) 명령을 사용하여 스크립트에서 여러 문자열을 검색하고 바꾸시겠습니까?

기상 강수량 파일을 생성하는 스크립트는 다음과 같습니다.

#!/bin/ksh

x=10
b=snow
c=rain
d=snow
e=hail
echo "$x,$b,$c,$d,$e" > weatherfile

exit 0

주어진

3,8s/snow/dry/g

검색 및 바꾸기의 경우 이 기능을 스크립트에서 구현하는 가장 좋은 방법은 무엇입니까?

명령 관점에서 볼 때 필요한가요 sed?

내 생각은 다음이 작동해야 한다는 것입니다.

sed 3,8s/snow/dry/g weatherfile

작동하지 않으면 sed어떻게 해야 합니까 ? 파일을 열고 닫아야 하는 경우와 실행 방법

:3,8s/snow/dry/g파일이 열리면? 구현 방법은 무엇입니까?

답변1

vim여기 문서와 함께 명령을 직접 사용할 수 있습니다 (이는 불규칙한 대체에 특히 유용합니다).

#!/bin/ksh
vim weatherfile <<EOF
:3,8s/snow/dry/g
:wq
EOF

답변2

다음과 같은 스크립트를 사용하여 셸에서 이 작업을 완전히 수행할 수 있습니다.

#!/bin/bash
line_num=0
while IFS= read -r line
do
        : $((line_num++))
        if [[ line_num -ge 3  &&  line_num -le 8 ]]
        then
                printf "%s\n" "${line/snow/dry}"
        else
                printf "%s\n" "$line"
        fi
done

(나는 이것을 bash에서 테스트했고앙드레보고서에 따르면 ksh에서는 작동하지만 모든 POSIX 호환 버전에서는 작동하지 않습니다 sh. )   표준 입력에서 행을 읽는다. 행 수를 계산합니다( 행 번호 범위를 지정하려면 line_num=0및 사용). 해당 요구 사항을 제거하면 인용문을 제거할 수 있습니다. 조건부 테스트: $((line_num++))line_num

        if [[ line_num -ge 3  &&  line_num -le 8 ]]

범위 3,8, 즉 3~8에 해당하는 "IF (line_num ≥ 3) AND (line_num ≥ 8)"을 의미합니다. (이것은 3,8"3과 8"을 의미하고 "3에서 8"이 의미할 것으로 기대하는 Unix 초보자에게는 혼란스러울 수 있습니다 3-8. 즉, Windows의 인쇄 대화 상자가 문서 페이지의 하위 집합을 인쇄하는 데 사용하는 규칙입니다.)

범위 내의 행에서는 다음을 사용합니다.

        ${범위/무늬/)

매개변수 확장 형식은 행을 표준 출력에 쓰기 전에 "snow"를 "dry"로 바꿉니다. 범위 밖의 행은 수정 없이 기록됩니다.

이렇게 하면 범위의 각 줄에 처음 나타나는 "눈"이 변경됩니다(있는 경우). 모든 항목을 바꾸려면 ${line//snow/dry}( /"snow" 앞에 추가 문자 삽입)을 사용합니다.

나는 당신이 원하는 큰 그림을 모릅니다.

  • 위 코드를 기존 스크립트에 통합할 수 있습니다.
  • weather.sh파일 대신 표준 출력에 쓰도록 스크립트를 수정했다면(이라고 부르자 ) 다음과 같이 말할 수 있습니다.

    ./weather.sh | ./do_substitute.sh > weatherfile
    
  • weatherfile지금과 같은 방식으로 만들고 나서 변경하고 싶다면 이렇게 하면 됩니다.

    ./do_substitute.sh < weatherfile > weatherfile.tmp
    mv weatherfile.tmp weatherfile
    

관련 정보