11. 주어진 파일에서 "MNO"라는 단어만 포함하는 줄의 끝까지 5번째 줄부터 시작하여 "DEF"라는 단어를 모두 "ABC"로 바꿉니다.

11. 주어진 파일에서 "MNO"라는 단어만 포함하는 줄의 끝까지 5번째 줄부터 시작하여 "DEF"라는 단어를 모두 "ABC"로 바꿉니다.
#!/bin/sh

counter=5
string="MNO"
while [ $counter -gt 0 ]
do
        for item in /Users/kristinautas/Desktop/DEFABC.txt
        do
                if [[ $(gsed $counter DEFABC.txt)=*string* ]]; then
                        gsed -i "$counter s/DEF/ABC/g" "DEFABC.txt"
                        counter=$(($counter+1))
                fi
        done
done

"DEFABC.txt" 파일의 5행에서 시작하는 모든 "DEF" 문자열을 "ABC" 문자열로 바꿀 수 있었습니다. 그러나 if 문을 사용하여 다른 조건을 추가하려고 하면(줄에 "MNO" 문자열이 포함된 경우에만 바꾸기) 스크립트는 여전히 줄 5 이후의 모든 항목을 바꿉니다. 내가 뭘 잘못했나요?

답변1

sed는 이 작업을 자체적으로 수행할 수 있습니다.

sed -e '5,${/MNO/s/DEF/ABC/g;}'

이것:

  1. 5부터 끝까지 라인만 선택해서 작업하세요. 코드는 중괄호 안에 있습니다.
  2. 그런 다음 포함된 세트에서 해당 라인만 선택하여 대체 명령을 MNO사용하여 해당 라인을 s교체합니다 .DEFABC

다른 모든 줄은 변경되지 않고 인쇄됩니다.

답변2

다음 명령을 시도해 보세요

sed –n '10,$p' file1|sed '/MNO/s/ABC/DEF/'

관련 정보