sed -n을 사용할 때 왜 sed -n ' $j,4800p'에 대해 오류가 발생합니까?

sed -n을 사용할 때 왜 sed -n ' $j,4800p'에 대해 오류가 발생합니까?
LINEnum=$(grep -nr "#32" IM_DlCtrlRef.txt | cut -d : -f 1)
for j in $LINEnum
do
    echo $j
    sed -n '$j,4800p'  IM_DlCtrlRef.txt >> IM_DlCtrlRef_bak
    for insertl in {1..4}
    do
        cat zero.txt >> IM_DlCtrlRef_bak
    done
done

답변1

주요 문제(구문 오류를 일으키는 문제)는 다음 sed줄에 있습니다.

sed -n '$j,4800p'  IM_DlCtrlRef.txt >> IM_DlCtrlRef_bak

$j스크립트 의 셸 변수를 sed시작 줄 번호로 사용하려고 하지만 (스크립트는 파일에서 4800 sed줄을 추출함 ) 작은따옴표를 사용하여 셸이 변수를 확장하지 못하게 합니다. $j즉 , 시작 주소가 시작 주소로 sed지정되어 끝이 없어 혼동될 수 있음을 의미합니다.$j

대신 큰따옴표를 사용하도록 해당 줄을 변경하기만 하면 됩니다.

이제 전체 스크립트를 살펴보면 다음과 같습니다.

LINEnum=$(grep -nr "#32" IM_DlCtrlRef.txt | cut -d : -f 1)
for j in $LINEnum
do
    echo $j
    sed -n "$j,4800p"  IM_DlCtrlRef.txt >> IM_DlCtrlRef_bak
    for insertl in {1..4}
        do
    cat zero.txt >> IM_DlCtrlRef_bak
        done
done

여기에는 수정하고 싶거나 수정하고 싶지 않을 수 있는 몇 가지 스타일 문제와 성능 문제가 있습니다.

먼저 모든 줄 번호를 변수로 읽습니다. 이는 메모리 낭비이지만 for-loop는 루프할 대상을 정확히 알아야 하기 때문에 이를 수행해야 합니다.

또 다른 해결책은 줄 번호를 하나씩 읽는 것입니다.

grep -nr "#32" IM_DlCtrlRef.txt | cut -d : -f 1 |
while read j; do
   # ...
done

이는 스크립트가 집어넣을 수 있는 데이터의 양에 제한이 없음을 의미합니다.

그런데 검색을 재귀적으로 -r수행하므로 grep여기서는 필요하지 않을 수도 있습니다. -F고정 문자열(정규 표현식이 아님)을 찾고 있으므로 로 바꾸십시오 .

그러나 일치하는 줄의 줄 번호에만 관심이 있으므로 #32전체 파이프를 다음으로 바꿀 수 있습니다.

sed -n '/#32/=' IM_DlCtrlRef.txt

sed명령은 =줄 번호를 인쇄합니다.

최종 수정을 통해 스크립트는 다음과 같습니다.

sed -n '/#32/=' IM_DlCtrlRef.txt |
while read j; do
    echo $j
    sed -n "$j,4800p" IM_DlCtrlRef.txt >>IM_DlCtrlRef_bak
    for insertl in {1..4}; do
        cat zero.txt >>IM_DlCtrlRef_bak
    done
done

관련 정보