¿Cómo reemplazo el texto que se encuentra en una ubicación específica de un archivo con texto ubicado en otro archivo con un script bash?

¿Cómo reemplazo el texto que se encuentra en una ubicación específica de un archivo con texto ubicado en otro archivo con un script bash?

Entonces digamos que tengo un archivo de texto,archivoparacambiar.txt:

3.141592       pi
6.626068       planck

# Like this and like that and like this
..1     kd6-officer kd6-officer
us..0 kd6-3.7
us00..0 kd6-3.8
us00..0 kd6-3.9
us00..0 kd6-3.1

Y tengo un segundo archivo,subarchivo.txt:

subtext

Quiero cambiar la palabra en la columna dos, línea dos, dearchivoparacambiar.txtcon la palabra ensubarchivo.txt; la palabra ensubarchivo.txtno siempre lo será subtext; la palabra enarchivoparacambiar.txtno siempre lo será planck. Lo mejor sería suponer que ambas palabras en ambos archivossiempreser palabras completamente diferentes.

Respuesta1

Para cambiar los caracteres que no están en blanco antes del final de la línea en la línea 2, puede usar

sed -i'' -e '2{s/[^[:blank:]]*$/'"$(cat subfile.txt)"'/;}' filetobechanged.txt

La -i''opción edita el archivo in situ (GNU/BSD sed). Es posible que su palabra subfile.txtno contenga ningún /carácter o tendría que reemplazar el /'s en el comando con un carácter que no esté presente en la palabra (por ejemplo, @o ,).

Respuesta2

Si no le importa preservar el espacio en blanco entre los campos, esto funcionará usando cualquier awk en cualquier shell en cada cuadro de UNIX y con cualquier carácter en cualquiera de los archivos de entrada, ya que simplemente está haciendo una asignación de cadena literal:

awk 'NR==FNR{new=$0; next} NR==2{$2=new} 1' subfile.txt filetobechanged.txt

si te importa entonces:

awk 'NR==FNR{new=$0; next} NR==2{sub(/[^[:space:]]+$/,""); $0=$0 new} 1' subfile.txt filetobechanged.txt

Para reemplazar la palabra X en la línea Y usando GNU awk para que el tercer argumento coincida():

awk -v x=5 -v y=3 '
    NR==FNR { new=$0; next }
    FNR==y {
        match($0,"([[:space:]]*([^[:space:]]+[[:space:]]+){"x-1"})[^[:space:]]+(.*)",a)
        $0 = a[1] new a[3]
    }
1' subfile.txt filetobechanged.txt

p.ej:

$ cat subfile.txt
[[[ \1 ~`!@#$%^&*()_-+={[}]|\:;"'<,>.?/ ]]]

$ cat filetobechanged.txt
Now is the winter of our discontent
Made glorious summer by this sun of York;
And all the clouds that lour'd upon our house
In the deep bosom of the ocean buried.

$ awk -v x=5 -v y=3 '
    NR==FNR { new=$0; next }
    FNR==y {
        match($0,"([[:space:]]*([^[:space:]]+[[:space:]]+){"x-1"})[^[:space:]]+(.*)",a)
        $0 = a[1] new a[3]
    }
1' subfile.txt filetobechanged.txt
Now is the winter of our discontent
Made glorious summer by this sun of York;
And all the clouds [[[ \1 ~`!@#$%^&*()_-+={[}]|\:;"'<,>.?/ ]]] lour'd upon our house
In the deep bosom of the ocean buried.

Si quieres hacer algo similar con sedentonces mirahttps://stackoverflow.com/q/29613304/1745001.

información relacionada