Tengo un comando de reemplazo de sed que me gustaría ser compatible con BSD sed
y GNU sed
. Las expresiones regulares extendidas no son un problema, ya que no las necesito en este caso. Mi problema principal es la diferencia en la forma en que los dos sed
s interpretan las secuencias de escape de caracteres en las cadenas de reemplazo . Mi cadena de reemplazo contiene pestañas y nuevas líneas y me gustaría que fueran visibles en las cadenas de comandos para facilitar el mantenimiento, sin embargo, BSD sed
no interpreta las secuencias de escape y GNU sed
sí . ¿Cuál es la forma adecuada de instruir sed
para interpretar estas secuencias de escape en BSD? Los siguientes dos fragmentos resumen mi problema:
ÑU sed
echo ABC | sed 's/B/\n\tB\n'
Yeilds
A
B
C
BSD sed
echo ABC | sed 's/B\n\tB\n'
rendimientos
AntBnC
Claramente, \n
y \t
no son interpretados como secuencias de escape por BSDsed
Ahora, a mi pregunta. Según la página de sed
manual de BSD :
Para especificar un carácter de nueva línea en la cadena de reemplazo, preceda con una barra diagonal inversa.
¿Esto implica que tendría que preceder una nueva línea literal por una barra diagonal inversa? ¿Cuál es la forma apropiada de instruir sed
para interpretar secuencias de escape como \n
en el texto de reemplazo?
sed
. Al final, probablemente tenga sentido usar awk. Entonces, ¿qué piensa sobre la interpretación de la página de manual de BSD sed que cité?Respuestas:
Si necesita escribir scripts portátiles, debe atenerse a las características del estándar POSIX (también conocido como Single Unix, también conocido como Open Group Base Specification). El número 7, también conocido como POSIX-1.2008, es el último, pero muchos sistemas aún no han terminado de adoptarlo. El número 6, también conocido como POSIX-1.2001, es proporcionado en general por todos los dispositivos modernos.
En sed , el significado de secuencias de escape como
\t
y\n
no es portátil, excepto que en una expresión regular ,\n
representa una nueva línea. En el texto de reemplazo para uns
comando,\n
no es portátil, pero puede usar la secuencia barra invertida-nueva línea para representar una nueva línea.Una forma portátil de generar un carácter de tabulación (o cualquier otro carácter expresado en octal) es con
tr
. Almacene el carácter en una variable de shell y sustitúyalo en el fragmento de sed.Tenga en cuenta nuevamente que las nuevas líneas deben expresarse de manera diferente en expresiones regulares y en
s
textos de reemplazo.Es posible que desee utilizar awk en su lugar. Permite escapes de barra diagonal inversa, incluidos escapes octales
\ooo
, en cada literal de cadena.fuente
Puede usar la
$'...'
cita bash para interpretar los escapes antes de pasar la cadena ased
.Desde la página de manual de bash:
fuente
Esto ha sido respondido en Stack Overflow:
/programming/1421478/how-do-i-use-a-new-line-replacement-in-a-bsd-sed
Es casi exactamente lo que dijo jw013.
Para insertar una pestaña literal, escriba ctrl+ VTab.
fuente