Substitua as palavras nos números de linha dados

0

Eu tenho um arquivo 1.txt

INTEGER-d_int ()
INTEGER-d_int  ()
INTEGER-d_int       (    )
INTEGER-d_intClass()
INTEGER-d_intClass     new()

e quero substituir a ocorrência de d_int por d_INT nas linhas 1 e 5.

No meu caso, esses números de linha estão em uma variável.

    
por Timson 19.02.2014 / 07:54

2 respostas

2

Defina as variáveis aeb nas linhas nas quais deseja fazer a substituição e execute awk:

a=1; b=5; awk '{ if (NR=='"$a"' || NR=='"$b"') sub("d_int","d_INT",$0); print $0}' 1.txt

Acima, o awk verifica se estamos no número de linha $a ou no número de linha $b . Se assim for, realiza a substituição.

Parte do truque de usar awk é proteger os comandos awk do shell. Para fazer isso, os comandos awk estão em aspas simples em todos os lugares, exceto onde explicitamente queremos que o shell substitua $a e $b . $a e $b estão cada entre aspas duplas.

No seu exemplo 1.txt , o acima produz:

INTEGER-d_INT ()
INTEGER-d_int  ()
INTEGER-d_int       (    )
INTEGER-d_intClass()
INTEGER-d_INTClass     new()

Abordagem Alternativa

sed também pode ser usado para isso. O comando sed para alterar apenas a linha 1 é 1 s/d_int/d_INT/ e o comando sed para alterar apenas a linha 5 é 5 s/d_int/d_INT/ . Assim, usando a substituição de shell, um programa sed para fazer as substituições nas linhas a e b é:

a=1; b=5; s='s/d_int/d_INT/' ; sed "$a $s; $b $s" 1.txt

Extensão para um número arbitrário de linhas

Suponha que recebamos uma lista arbitrária de lines para aplicar a substituição:

lines="1 5 6 9 15 19 20"
s='s/d_int/d_INT/'
for line in $lines
do
    echo line=$line
    cmd="$line $s; $cmd"
done
echo cmd=$cmd
sed "$cmd" 1.txt
    
por 19.02.2014 / 08:27
-1
sed -i '1,5s/d_int/d_INT/' 1.txt
    
por 20.02.2014 / 11:02