sed -n [duplicate]를 사용할 때 sed -n ' $j,4800p'에서 오류가 발생하는 이유는 무엇입니까?

sed -n [duplicate]를 사용할 때 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파일에서 sed라인 4800을 추출함 ) 작은따옴표를 사용하여 쉘이 변수를 확장하지 못하게 합니다. $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

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

먼저 모든 줄 번호를 변수로 읽어옵니다. 이는 메모리 낭비이지만 -loop는 for무엇을 반복할지 정확히 알아야 하기 때문에 이를 수행해야 합니다.

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

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

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

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

그러나 일치하는 line의 행 번호에만 관심이 있으므로 #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

관련 정보