2012-03-27 14 views
17

Tengo un archivo de la siguiente manera:La colocación de cada personaje en una nueva línea

This is a sentence. 
This is another sentence. 

tengo que poner una nueva línea después de cada carácter, de tal manera que sólo un personaje aparece en cada línea, por ejemplo:

T 
h 
i 
s 

i 
s 

a 

s 
e 
n 
t 
e 
n 
c 
e 
. 
T 
h 
i 
s 

i 
s 

a 
n 
o 
t 
h 
e 
r 

s 
e 
n 
t 
e 
n 
c 
e 
. 
  • El archivo está en UTF-8 y contiene muchos caracteres que no están en inglés.
  • No importa si los espacios o los retornos de carro tienen su propia línea.

¿Cómo puedo eliminar cada carácter de una nueva línea?

+0

¿Quieres todos los bytes en una línea separada o cada personaje? –

+0

LOL Siempre tengo el problema opuesto, termino escribiendo loops que imprimen cada carácter en su propia línea cuando se supone que están en oraciones: P –

Respuesta

18

usando sed Cambiar cada carácter con el mismo seguido por un salto de línea:

sed 's/\(.\)/\1\n/g' -i filename 
+3

equivalente de OS X: 'sed-e 's/\ (. \)/\ 1 \ '$' \ n/g '-i' 'filename' – jkukul

+1

¿Puedes explicar este comando? – juggernaut1996

5

Usando campo de entrada y salida de los separadores de awk:

awk -F '' -v 'OFS=\n' '{$1=$1}1' filename 

o Perl

perl -F// -lane 'print join "\n", @F' filename 
3

No es tan corta como PaulP.R.O.'s answer, pero es útil si desea realizar alguna operación en cada carácter:

while read -r -n 1 -d '' -u 9 
do 
    printf "Uppercase '${REPLY^^}', " 
    printf "lowercase '${REPLY,,}', " 
    printf "literal $(printf "$REPLY" | uniname -bcegpu | tail -1)" 
    printf '\n' 
done 9< "path" 
8
  • sed $'s/./&\\\n/g' (con BSD SED)
    • O sed 's/./&\n/g' con sed de GNU
    • No incluye líneas vacías para saltos de línea
  • fold -w1
    • -w especifica anchura en caracteres
    • No incluye líneas vacías para saltos de línea
  • while IFS= read -r -n1 -d '' c; do printf %s\\n "$c"; done
    • Incluye líneas vacías para saltos de línea con -d ''
    • La única opción para read especificada por POSIX es -r
  • gawk -F '' 'OFS="\n"{$1=$1}1'
    • O awk 'BEGIN{FS="";OFS="\n"}{$1=$1}1' in nawk (BSD awk, el awk que viene con OS X); no funciona con caracteres de varios bytes, aunque
    • Tampoco incluye líneas vacías para saltos de línea

Todos excepto el comando nawk trabajó con caracteres no ASCII en mi entorno cuando LC_CTYPE se estableció en un UTF-8 lugar. Ninguno colapsó o despojó espacios.

7

Uso grep, en el ejemplo:

$ grep -o . file 
$ echo This is a sentence. | grep -o . 

o fold:

$ fold -w1 file 
$ echo This is a sentence. | fold -w1 
Cuestiones relacionadas