Usando una herramienta de línea de comando común como sed o awk, ¿es posible unir todas las líneas que terminan con un carácter dado, como una barra invertida?
Por ejemplo, dado el archivo:
foo bar \
bash \
baz
dude \
happy
Me gustaría obtener esta salida:
foo bar bash baz
dude happy
text-processing
awk
sed
perl
Cory Klein
fuente
fuente
cpp
:)sed
Preguntas frecuentesRespuestas:
Una solución sed más corta y simple:
o una línea si usa GNU
sed
:fuente
sed
:) ... Usted está agregando cada línea directamente al espacio del patrón, y cuando aparece una línea "normalmente terminada", aparece todo el espacio del patrón se cae y se imprime automáticamente (porque no hay una opción -n) ... ¡limpio! .. +1sed -e :a -e '/\\$/N; s/\\\n//; ta'
Posiblemente sea más fácil con perl (dado que perl es como sed y awk, espero que sea aceptable para usted):
fuente
Aquí hay una solución awk. Si una línea termina con a
\
, retire la barra diagonal inversa e imprima la línea sin nueva línea de terminación; de lo contrario, imprima la línea con una nueva línea final.Tampoco es tan malo en sed, aunque awk es obviamente más legible.
fuente
Esta no es una respuesta como tal. Es un tema secundario sobre
sed
.Específicamente, necesitaba tomar Gilles
sed
separar el comando de pieza por pieza para entenderlo ... Comencé a escribir algunas notas sobre él, y luego pensé que podría ser útil aquí para alguien ...así que aquí está ... el script sed de Gilles en formato documentado :
fuente
Sin embargo, sería otra herramienta de línea de comando común
ed
, que por defecto modifica los archivos en su lugar y, por lo tanto, deja los permisos de los archivos sin modificar (para obtener más información,ed
consulte Edición de archivos con el editor de texto ed desde scripts )fuente
Usando el hecho de que
read
en el shell interpretará barras invertidas cuando se usa sin-r
:Tenga en cuenta que esto también interpretará cualquier otra barra diagonal inversa en los datos.
fuente
a\\b\\\\\\\\\\\c
Una solución simple (r) que carga todo el archivo en la memoria:
O uno todavía corto que funciona entendiendo líneas (salida) (sintaxis GNU):
En una línea (sintaxis POSIX):
O use awk (si el archivo es demasiado grande para caber en la memoria):
fuente
La versión de Mac basada en la solución @Giles se vería así
Donde la diferencia principal es cómo se representan las nuevas líneas, y la combinación de más en una línea lo divide
fuente
Puede usar cpp, pero produce algunas líneas vacías donde fusionó la salida, y alguna introducción que elimino con sed; tal vez también se puede hacer con cpp-flags y opciones:
fuente
cpp
es una solución? En su ejemplo, laecho
cadena con comillas dobles ya genera texto enderezado, por lo que nocpp
tiene sentido. (Esto también se aplica a sused
código). Si coloca la cadena entre comillascpp
simples , simplemente elimina las barras invertidas pero no concatena las líneas. (La concatenación concpp
funcionaría si no hubiera espacio antes de las barras diagonales inversas, pero luego las palabras separadas se unirían sin separadores.)cpp
así todavía no concatena las líneas para mí. Y el uso desed
definitivamente es innecesario. Usocpp -P
: "-P
Inhibir la generación de marcadores de línea en la salida del preprocesador". - man cppcpp: “-P: No such file or directory cpp: warning: '-x c' after last input file has no effect cpp: unrecognized option '-P:' cpp: no input files
Acpp --version
revelacpp (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3
: ¿qué? Ubuntu está parcheando cpp? ¿Por qué? Hubiera esperado leer GNU ...cpp
hecho , Ubuntu concatena las líneas y deja algunos espacios en blanco. Aún más interesante, la misma versión 4.4.3-4ubuntu5.1 aquí acepta-P
. Sin embargo, solo elimina los marcadores de línea, las líneas vacías permanecen.