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.txt
no 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 sed
entonces mirahttps://stackoverflow.com/q/29613304/1745001.