Estoy usando un analizador bisonte en mi proyecto. Cuando ejecuto el siguiente comando:
sed -i y.tab.c -e "s/ __attribute__ ((__unused__))$/# ifndef __cplusplus\n __attribute__ ((__unused__));\n# endif/"Recibo este error sed: -i may not be used with stdin
El comando funciona bien en máquinas Linux. Estoy usando Mac OS X 10.9. Lanza un error solo en mac os x. No estoy seguro por qué. ¿Alguien puede ayudar?
Gracias
El problema es que Mac OS X usa la versión BSD de sed , que trata la opción -i de forma ligeramente diferente. La versión de GNU utilizada en Linux toma un argumento opcional con -i : si está presente, sed un archivo de respaldo cuyo nombre consiste en el archivo de entrada más el argumento. Sin argumentos, sed simplemente modifica el archivo de entrada sin guardar una copia de seguridad del original.
En BSD sed , se requiere el argumento para -i . Para evitar hacer una copia de seguridad, debe proporcionar un argumento de longitud cero, por ejemplo, sed -i '' y.tab.c ... .
Su comando, que simplemente edita y.tab.c sin respaldo en Linux, intentará guardar un archivo de respaldo usando 'y.tab.c' como extensión. Pero ahora, sin otro archivo en la línea de comando, sed cree que desea editar la entrada estándar en el lugar, algo que no está permitido.
De la página de manual de sed:
-i extensión Editar archivos en el lugar, guardando copias de seguridad con la extensión especificada. Si se proporciona una extensión de longitud cero, no se guardará ninguna copia de seguridad. No se recomienda dar una extensión de longitud cero cuando se editan archivos en el lugar, ya que corre el riesgo de corrupción o contenido parcial en situaciones en las que se agota el espacio en disco, etc.
La solución es enviar una extensión de longitud cero como esta:
sed -i '' 's/apples/oranges/' file.txtDebe colocar el archivo de entrada como último parámetro.
sed -i -e "s/ __attribute__ ((__unused__))$/# ifndef __cplusplus\n __attribute__ ((__unused__));\n# endif/" y.tab.c