2011-07-31 10 views
7

Estaba haciendo algunas prácticas con el comando Unix sed. Estaba probando el comando de sustitución y adición en un archivo. Pero la dificultad es que tengo que crear un archivo intermedio y luego hacer mv para cambiarle el nombre al archivo original.¿Cómo sustituir sin crear un archivo intermedio en sed?

¿Hay alguna manera de hacerlo de una vez en el mismo archivo?

[[email protected] practice]# sed '1i\ 
> Today is Sunday 
> ' file1 > file1 

[[email protected] practice]# cat file1 
[[email protected] practice]# 

¡Se borró el archivo!

[[email protected] practice]# sed 's/director/painter/' file1 > file1 
[[email protected] practice]# cat file1 

¡Se borró el archivo!

+1

¿Alguien ha votado negativamente mi pregunta? ¿Pero por qué? – kingsmasher1

Respuesta

11

GNU sed conoce una opción -i que hace in situ edición de los archivos dados.

Al hacer una operación file1 > file1 lo que realmente sucede es que el archivo es abierto y truncada por la cáscara antes el programa (que recibe su nombre como argumento), vuelve a leer nada de él.

actualización:

de página del manual indica lo siguiente en la opción -i sed (gracias Delan para mencionarlo):

-i[SUFFIX], --in-place[=SUFFIX] 

      edit files in place (makes backup if extension supplied) 
+0

¿De verdad? ¿Quiere decir que con la opción -i puedo sustituir y anexar al mismo archivo? Déjame probar. – kingsmasher1

+2

Asegúrese de evitar la agrupación de cualquier otra opción de argumentos después de '-i'. A menudo uso 'sed -i -r' para hacer un sed en el lugar con ERE, pero no puedo usar' sed -ir' porque eso haría una copia de seguridad, con el sufijo 'r' en los archivos de copia de seguridad. –

+0

* in situ * como en, edite las líneas que coinciden, deje a los demás en paz. * NO * Agregar –

1

sed -i.bak 's/director/pintor/'archivo1

-i[SUFFIX], --in-place[=SUFFIX] 

    edit files in place (makes backup if extension supplied) 
+0

Gracias, sí, lo intenté funcionó. Pero la salida de la consola está suprimida. Votación para ti y Fritschy :) – kingsmasher1

11

Pruebe esto -

sed -i '' 's/originaltext/replacementtext/g' filename | cat filename 

-i '' es para proporcionar un archivo de copia de seguridad. Si está seguro de que su reemplazo no causará un problema, puede poner '' para pasar ningún archivo de copia de seguridad

/g es para reemplazar a nivel mundial. Si tiene más de un texto original en una línea, entonces con la opción/g reemplazará todo lo demás, solo reemplazará el primero.

+0

Usando 'sed-i''' sin un espacio trabajado para mí en gitbash – cjsimon

+0

' sed -i '' '(con un espacio) funcionará con BSD sed, pero solo' sed -i ' '' (sin espacio) funcionará con GNU sed. Bastante frustrante en realidad. –

Cuestiones relacionadas