기상 강수량 파일을 생성하는 스크립트는 다음과 같습니다.
#!/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