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