Duda (creo que) sencilla de shell script

AlterElt está baneado por "troll"
Buenas,

estoy haciendo un programilla en shell script (uso csh), el caso es que llevo un rato buscando en google como editar un campo de un registro y no lo encuentro :S

Tengo en $linea el registro, que contiene los datos: "487:00001:1:N" y quiero cambiar la N por una S, pero no encuentro el comando :S

Con awk he probado pero me peta porque me intenta cambiar toda la columna del archivo, y yo solo quiero cambiar ese campo en concreto que ya digo que tengo en la variable $linea

Con:
echo $linea | cut -d: -f4

puedo ver ese campo solo, pero como leches lo cambio?? Es que me estoy volviendo loco con esta chorrada xD

A ver si alguien me puede decir como... :P
usando sed
echo $linea | sed 's/:N/:S/'


directo desde el shell (no se si funcionara con csh tambien)
echo ${linea%:N}:S
AlterElt está baneado por "troll"
codestation escribió:usando sed
echo $linea | sed 's/:N/:S/'


directo desde el shell (no se si funcionara con csh tambien)
echo ${linea%:N}:S


Buenas! Pues es correcto, pero con esa instrucción me printa por pantalla la linea cambiada, pero no me cambia la linea en el archivo :S

Podría hacer un append

set aux = `echo $linea2 | sed 's/:N/:S/'`
echo $aux >> reservas

pero entonces no me eliminaría la fila que quiero editar :S

joder, ya se lo podría ocurrir a alguien programar un comando para tratar todo esto como una matriz de datos xD del rollo "datos[x][y] = dato_modificado" xDDD
Se me escapó lo del archivo, pero aún no capto del todo lo que intentas hacer. La verdad es que soy un novato usando sed y no te puedo ser de gran ayuda, pero se me ocurre esto:

sed  -i "s/${linea}/${linea%:N}:S/" reservas
AlterElt está baneado por "troll"
Por ahi anda la historia

tiene que ser algo por el estilo de esto, que bien dices:

sed -i "s/${linea2%:N}/${linea2%:S}/" reservas

pero el sed se queda ahi y no hace nada, me dice missing }

el problema que tiene esa linea es que me dice "missing }" :S esto es una locura xDDD

El problema está en la palabra por la que hay que substituir me imagino... como le especifico que sea solo el último campo de $linea2 ? por lo que me has puesto entiendo que con %:N no sería más logico entonces:



Lo que quiero hacer es basicamente que me coja esa linea ($linea2) y me la cambie por la otra, por ejemplo

de esto:

490:00001:20:N

a esto:

490:00001:20:S

y el fichero sería algo así:

605:21083:1:S
535:21083:2:S
531:21395:1:S
535:21395:2:S
537:21395:3:S
539:00050:1:S
487:00001:1:S
488:00001:2:S
489:00001:3:S
490:00001:20:N

La fila esa no tiene porque estar en la última posición... de hecho para después de editar el archivo haré un sort para que me lo ordene todo según el primer campo y si luego se lanzase otra vez el script pues buscaría la linea a editar y la cambiaría (eso ya lo tengo hecho). Solo me falta lo de editar ese campo :S

saludos y gracias

EDITO:

Por fin!! XD lo conseguí XD

Ahí va la solución:

set linea2_mod = `echo $linea2 | sed 's/:N/:S/'`
sed -i "s/${linea2}/${linea2_mod}/" reservas

Me estaba volviendo loco ya xD Más que nada porque leyendo, leí a un guiri que decía que sed no aceptaba variables de shell y ya me estaba entrando la mala leche xD
4 respuestas