regex - regular - Reemplazar todos los espacios en blanco con un salto de línea/marca de párrafo para hacer una lista de palabras
salto de linea latex (8)
Estoy tratando de enumerar vocabulario para un texto griego que estamos traduciendo en clase. Quiero reemplazar cada espacio o carácter de tabulación con una marca de párrafo para que cada palabra aparezca en su propia línea. ¿Alguien puede darme el comando sed y explicarme qué es lo que estoy haciendo? Todavía estoy tratando de averiguar sed.
Opción 1
echo $(cat testfile)
opcion 2
tr '' '' ''/n'' < testfile
Esto debería hacer el trabajo:
sed -e ''s/[ /t]+//n/g''
[ /t]
significa un espacio O una pestaña. Si quieres cualquier tipo de espacio, también puedes usar /s
.
[ /t]+
significa tantos espacios O pestañas como desee (pero al menos uno)
s/x/y/
significa reemplazar el patrón x por y (aquí /n
es una nueva línea)
La g
al final significa que debe repetir tantas veces como ocurra en cada línea.
La forma portátil de hacer esto es:
sed -e ''s/[ /t][ /t]*//
/g''
Esa es una nueva línea entre la barra invertida y la barra inclinada. Muchas implementaciones sed no tienen conocimiento de /n
, por lo que necesita una nueva línea literal. La barra invertida antes de la nueva línea evita que sed se enoje con la nueva línea. (en los scripts sed los comandos normalmente son terminados por líneas nuevas)
Con GNU sed puedes usar /n
en la sustitución, y / s en la expresión regular:
sed -e ''s//s/s*//n/g''
GNU sed también admite expresiones regulares "extendidas" (es decir, estilo egrep, no estilo perl) si le das el distintivo -r, entonces puedes usar +
:
sed -r -e ''s//s+//n/g''
Si esto es solo para Linux, probablemente pueda usar el comando GNU, pero si desea que esto funcione en sistemas con un sedimento que no sea GNU (p. Ej .: BSD, Mac OS-X), es posible que desee ir más allá. opción portátil.
Para versiones razonablemente modernas de sed, edite la entrada estándar para producir la salida estándar con
$ echo ''τέχνη βιβλίο γη κήπος'' | sed -E -e ''s/[[:blank:]]+//n/g''
τέχνη
βιβλίο
γη
κήπος
Si las palabras de su vocabulario están en los archivos llamados lesson1
y lesson2
, redirija la salida estándar de sed al archivo all-vocab
con
sed -E -e ''s/[[:blank:]]+//n/g'' lesson1 lesson2 > all-vocab
Lo que significa:
- La clase de caracteres
[[:blank:]]
coincide con un carácter de espacio único o un carácter de una sola pestaña.- Utilice
[[:space:]]
lugar para hacer coincidir cualquier carácter de espacio en blanco (comúnmente espacio, pestaña, nueva línea, retorno de carro, avance de página y pestaña vertical). - El cuantificador
+
significa que coincide con uno o más del patrón anterior . - Entonces,
[[:blank:]]+
es una secuencia de uno o más caracteres que son todos espacios o tabuladores.
- Utilice
- El
/n
en el reemplazo es la nueva línea que desea. - El modificador
/g
en el extremo significa realizar la sustitución tantas veces como sea posible en lugar de solo una vez. - La opción
-E
le dice a sed que use la sintaxis de expresiones regulares extendidas de POSIX y, en particular para este caso, el cuantificador+
. Sin-E
, tu comando sed se convierte ensed -e ''s/[[:blank:]]/+//n/g''
. (Tenga en cuenta el uso de/+
lugar de simple+
.)
Pergex Regexes compatibles
Para aquellos familiarizados con expresiones regulares compatibles con Perl y un sedimentado compatible con PCRE, use /s+
para unir ejecuciones de al menos un carácter de espacio en blanco, como en
sed -E -e ''s//s+//n/g'' old > new
o
sed -e ''s//s/+//n/g'' old > new
Estos comandos leen la entrada del archivo old
y escriben el resultado en un archivo llamado new
en el directorio actual.
Máxima portabilidad, máxima precisión
Volviendo a casi cualquier versión de sed desde la Versión 7 de Unix , la invocación del comando es un poco más barroca.
$ echo ''τέχνη βιβλίο γη κήπος'' | sed -e ''s/[ /t][ /t]*//
/g''
τέχνη
βιβλίο
γη
κήπος
Notas:
- Aquí ni siquiera suponemos la existencia del humilde
+
cuantificador y lo simulamos con un solo espacio o tabulación ([ /t]
) seguido de cero o más de ellos ([ /t]*
). - De forma similar, suponiendo que sed no comprenda
/n
para newline, tenemos que incluirlo en la línea de comando textualmente.- El
/
y el final de la primera línea del comando es un marcador de continuación que escapa de la nueva línea inmediatamente siguiente, y el resto del comando está en la siguiente línea.- Nota: No debe haber espacios en blanco antes de la nueva línea escapada. Es decir, el final de la primera línea debe ser exactamente una barra invertida seguida de un final de línea.
- Este proceso propenso a errores ayuda a apreciar por qué el mundo se movió a caracteres visibles, y querrá tener cuidado al probar el comando con copiar y pegar.
- El
Nota sobre barras diagonales inversas y citas
Los comandos usaban comillas simples ( ''''
) en lugar de comillas dobles ( ""
). Considerar:
$ echo ''////' "////"
//// //
Es decir, el shell aplica diferentes reglas de escape a cadenas de una sola comilla en comparación con las cadenas de comillas dobles. Por lo general, desea proteger todas las barras diagonales comunes en expresiones regulares con comillas simples .
Puede usar POSIX [[:blank:]]
para que coincida con un carácter de espacio en blanco horizontal.
sed ''s/[[:blank:]]/+//n/g'' file
o puede usar [[:space:]]
lugar de [[:blank:]]
también.
Ejemplo:
$ echo ''this is a sentence'' | sed ''s/[[:blank:]]/+//n/g''
this
is
a
sentence
También puedes hacerlo con xargs
:
cat old | xargs -n1 > new
o
xargs -n1 < old > new
Todos los ejemplos enumerados anteriormente para sed break en una plataforma u otra. Ninguno de ellos funciona con la versión de sed enviada en Mac.
Sin embargo, la expresión regular de Perl funciona igual en cualquier máquina con Perl instalado:
perl -pe ''s//s+//n/g'' file.txt
Si quieres guardar el resultado:
perl -pe ''s//s+//n/g'' file.txt > newfile.txt
Si solo desea apariciones únicas de palabras:
perl -pe ''s//s+//n/g'' file.txt | sort -u > newfile.txt
Usando gawk
:
gawk ''{$1=$1}1'' OFS="/n" file