
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