Me gustaría editar un archivo con sed en OS X. Estoy usando el siguiente comando:
sed 's/oldword/newword/' file.txt
La salida se envía al terminal. file.txt no se modifica. Los cambios se guardan en file2.txt con este comando:
sed 's/oldword/newword/' file1.txt > file2.txt
Sin embargo, no quiero otro archivo. Solo quiero editar file1.txt . ¿Cómo puedo hacer esto?
He probado la bandera -i. Esto da como resultado el siguiente error:
sed: 1: "file1.txt": invalid command code f
-i
bandera?Respuestas:
Puede usar el
-i
indicador correctamente proporcionándole un sufijo para agregar al archivo respaldado. Extendiendo su ejemplo:Le dará dos archivos: uno con el nombre
file1.txt
que contiene la sustitución y otro con el nombrefile1.txt.bu
que tiene el contenido original.Levemente peligroso
Si desea sobrescribir destructivamente el archivo original, use algo como:
Debido a la forma en que se analiza la línea, se requiere un espacio entre el indicador de opción y su argumento porque el argumento es de longitud cero.
Aparte de posiblemente destrozar su original, no estoy al tanto de ningún peligro adicional de engañar a sed de esta manera. Sin embargo, debe tenerse en cuenta que si esta invocación
sed
es parte de un script, The Unix Way ™ (IMHO) sería usar de manerased
no destructiva, probar que salió limpiamente y solo luego eliminar el archivo extraño.fuente
-i''
peligroso por alguna razón que no sea desordenar el archivo original (y no tener una copia de seguridad)?sed
página del manual, si se queda sin espacio en disco en el dispositivo, podría dañar un archivo a mitad de camino y tener un resultado de salida incorrecto. Si está trabajando bajo control de fuente localsed -i ""
sin copias de seguridad, debería estar bien la mayor parte del tiempo (o justogit init && git add -A . && git commit -m 'backup'
antes de ejecutar sed en-i
modo).-i''
es válido, pero-i ''
no lo es.Tengo un problema similar con MacOS
no funciona pero
funciona bien.
fuente
sed -i '' <file>
funciona perosed -i'' <file>
ya no funcionafuente
Puede usar
-i''
(--in-place
)sed
como ya se sugirió. Ver: El-i
argumento en el lugar , sin embargo, tenga en cuenta que la-i
opción es extensiones de FreeBSD no estándar y puede no estar disponible en otros sistemas operativos. En segundo lugarsed
es un S TREAM ED itor, no un editor de archivos .La forma alternativa es utilizar la sustitución integrada en el modo Vim Ex, como:
y para múltiples archivos:
Para editar todos los archivos de forma recursiva, puede usar
**/*.*
si shell lo admite (habilitar porshopt -s globstar
).Otra forma es usar
gawk
y su nueva extensión "in situ" como:fuente
Esto crea archivos de respaldo. Por ejemplo,
sed -i -e 's/hello/hello world/' testfile
para mí, crea un archivo de respaldo, testfile-e, en el mismo directorio.fuente
Puedes usar:
Ejemplo:
Esto funciona perfectamente en Mac .
fuente
-i
requiere un argumento para macOS. Como no especifica uno, lo utiliza-e
, lo que resulta en tener un segundo archivo-e
adjunto.-e
no existe en macOS, lo es-E
. Entonces, el comando correcto para macOS essed -i '' -E 's/Hello/Bye/' file.txt