
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
Responder1
Seu principal problema (aquele que causa um erro de sintaxe) está na sed
linha:
sed -n '$j,4800p' IM_DlCtrlRef.txt >> IM_DlCtrlRef_bak
Você deseja usar a variável shell $j
em seu sed
script como o número da linha inicial (o sed
script extrai linhas $j
até 4800 de um arquivo), mas evita que o shell expanda a variável usando aspas simples. Isso significa que sed
ele será $j
o endereço inicial, o que o confundirá sem fim.
Simplesmente altere essa linha para colocar 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 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 fazer.
Outra solução seria ler os números das linhas 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 a quantidade de dados que o script é capaz de absorver.
Aliás, -r
faz grep
pesquisa recursivamente, então provavelmente isso não é necessário aqui. Substitua-o por, -F
pois você está procurando uma string fixa (não uma expressão regular).
No entanto, como você está interessado apenas nos números de linhas correspondentes #32
, você pode substituir todo o canal por
sed -n '/#32/=' IM_DlCtrlRef.txt
O sed
comando =
imprime números de linha.
Com uma rodada final de retoques, o roteiro 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