Xavier, miembro de este staff, nos hizo el favor de redactar esta crónica ya que domina perfectamente este tema.
Solución:
Es porque sed
disponible en OSX no reconoce r
como un carácter especial a diferencia del sed
en Linux lo hace.
Puedes usarlo de la forma en que lo estás usando:
sed -i.bak $'s/r//' file
O esto:
sed -i.bak "s/$(printf 'r')//" file
O bien puedes usar tr
en OSX:
tr -d 'r' < file
Otra solución portátil y flexible es:
sed -i.bak $'s/x0D//' file
Porque el carácter de retorno tiene el código ASCII 0D. Las sustituciones x funcionan para todas las versiones POSIX de sed, y puede hacer coincidir cualquier otro carácter problemático buscando el código ASCII. Para encontrar otras sustituciones válidas, ejecute man re_format
o ver una tabla ASCII.
El /g final es necesario para Linux porque el retorno de carro (r) no finaliza la línea. Muchos editores de "texto sin formato" de Windows (por ejemplo, el Bloc de notas) finalizan cada línea con un retorno de carro y una nueva línea (rn), pero las Mac con OS 9 (aprox. 2001) o anteriores finalizaban cada línea de un archivo de "texto sin formato". con un solo r. Si está limpiando un archivo de Windows, el /g no es necesario en ningún sistema *X. Si está en macOS, el /g tampoco es necesario, porque macOS reconoce el único r como un final de línea.
(Un sistema Linux que lea un archivo antiguo de Mac pensará que todo el texto está en una línea muy larga y solo convertirá el primer r. Si está en un sistema Linux y necesita conservar los saltos de línea de un archivo antiguo de Mac,
sed -i.bak $'s/x0D/x0A/g' file
convierte cada r en n.)