quando usei sed -n, por que isso erra sobre sed -n '$j,4800p'

quando usei sed -n, por que isso erra sobre 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

Responder1

Seu principal problema (aquele que causa um erro de sintaxe) está na sedlinha:

sed -n '$j,4800p'  IM_DlCtrlRef.txt >> IM_DlCtrlRef_bak

Você deseja usar a variável shell $jem seu sedscript como o número da linha inicial (o sedscript extrai linhas $jaté 4800 de um arquivo), mas evita que o shell expanda a variável usando aspas simples. Isso significa que sedele será $jo 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, -rfaz greppesquisa recursivamente, então provavelmente isso não é necessário aqui. Substitua-o por, -Fpois 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 sedcomando =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

informação relacionada