quando eu usei sed -n, por que isso errar sobre sed -n '$ j, 4800p' [duplicado]

0
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
    
por Mark 23.06.2016 / 10:15

1 resposta

0

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
    
por 23.06.2016 / 10:34