Reemplazar palabras en números de línea dados

0

Tengo un archivo 1.txt

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

y quiero reemplazar la ocurrencia de d_int con d_INT En las líneas 1 y 5.

En mi caso, estos números de línea están en una variable.

Timson
fuente
Ya que has etiquetado esto con awk, ¿es esta la única posibilidad? ¿Qué has probado ya?
slhck
No estoy seguro de si funcionará en awk. Quiero resultado puedo usar cualquier comando
Timson

Respuestas:

2

Establezca las variables a y b en las líneas en las que desea realizar la sustitución y luego ejecute awk:

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

En lo anterior, awk verifica si estamos en el número de línea. $a o en el numero de linea $b. Si es así, realiza la sustitución.

Parte del truco de usar awk es proteger el awk comandos desde el shell. Para hacer esto, el awk los comandos están entre comillas simples en todas partes, excepto cuando queremos explícitamente que la shell sustituya a for $a y $b. $a y $b están cada uno en comillas dobles

En su muestra 1.txt, lo anterior produce:

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

Enfoque alternativo

sed También se puede utilizar para esto. El comando sed para cambiar solo la línea 1 es 1 s/d_int/d_INT/ y el sed El comando para cambiar solo la línea 5 es 5 s/d_int/d_INT/. Por lo tanto, utilizando la sustitución de shell, un sed Programa para hacer las sustituciones en líneas. a y b es:

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

Extensión a un número arbitrario de líneas.

Supongamos que nos suministran una lista arbitraria de lines Sobre la cual aplicar la sustitución:

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
John1024
fuente
+1 también por la bonita y clara explicación.
MariusMatutiae
gracias ... tengo un archivo o una variable que tiene los números de línea y quiero reemplazar las palabras en esa línea, ¿es posible?
Timson
@Timson Probablemente. Déjame saber cómo se ve tu "archivo o variable".
John1024
echo $ lineas - 1 5 6 9 15 19 20
Timson
@Timson Ver respuesta actualizada.
John1024
-1
sed -i '1,5s/d_int/d_INT/' 1.txt
seqizz
fuente
No, esto no funciona. Además, probablemente debas explicar un poco las frases.
Olli
Cambia las líneas del uno al cinco.
Ashtray
Dice -i: edita el archivo 1,5s: subst. en líneas entre 1 y 5, tal vez no entendí exactamente lo que querías ...
seqizz