Seu problema principal (aquele que causa um erro de sintaxe) está na linha sed
:
sed -n '$j,4800p' IM_DlCtrlRef.txt >> IM_DlCtrlRef_bak
Você deseja usar a variável de shell $j
no script sed
como o número da linha inicial (o script sed
extrai as linhas $j
a 4800 de um arquivo), mas você impede que o shell se expanda a variável usando aspas simples. Isso significa que sed
obterá $j
como o endereço inicial, o que não causará problemas.
Basta alterar essa linha para ter aspas duplas.
Agora, olhando o script completo:
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
Isso tem alguns problemas de estilo e problemas de desempenho que você pode ou não querer corrigir.
Primeiramente, você lê todos os números de linha em uma variável. Isso é um desperdício de memória, mas você precisa fazer isso porque o for
-loop precisa saber exatamente o que deve ser executado.
Outra solução seria ler os números de linha um por um:
grep -nr "#32" IM_DlCtrlRef.txt | cut -d : -f 1 |
while read j; do
# ...
done
Isso significa que não há limite para quantos dados o script pode engolir.
BTW, -r
torna a pesquisa grep
recursiva, o que provavelmente não é necessário aqui. Substitua por -F
desde que você esteja procurando por uma string fixa (não uma expressão regular).
No entanto, como você só está interessado em números de linha de linhas correspondentes a #32
, você pode substituir o canal inteiro por
sed -n '/#32/=' IM_DlCtrlRef.txt
O sed
command =
imprime números de linha.
Com uma rodada final de retoques, o script se torna
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