Подтвердить что ты не робот

Размещение каждого символа на новой строке

У меня есть файл вроде этого:

This is a sentence.
This is another sentence.

Мне нужно поместить новую строку после каждого символа, чтобы в каждой строке отображался только один символ, например:

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
.
  • Файл находится в UTF-8 и содержит много неанглийских символов.
  • Не имеет значения, имеют ли пробелы или каретки свою строку.

Как я могу удалить каждый символ в новую строку?

4b9b3361

Ответ 1

Используя sed, замените каждый символ на себя, за которым следует новая строка:

sed 's/./\0\n/g' -i filename

Ответ 2

  • sed $'s/./&\\\n/g' (с BSD sed)
    • Или sed 's/./&\n/g' с GNU sed
    • Не включает пустые строки для перевода строк
  • fold -w1
    • -w указывает ширину символов
    • Не включает пустые строки для перевода строк
  • while IFS= read -r -n1 -d '' c; do printf %s\\n "$c"; done
    • Включает пустые строки для перевода строк с помощью -d ''
    • Единственной опцией read, заданной POSIX, является -r
  • gawk -F '' 'OFS="\n"{$1=$1}1'
    • Или awk 'BEGIN{FS="";OFS="\n"}{$1=$1}1' в nawk (BSD awk, awk, который поставляется с OS X); он не работает с многобайтными символами, хотя
    • Ни один из них не содержит пустые строки для перевода строк

Все, кроме команды nawk, работали с символами, отличными от ASCII, в моей среде, когда LC_CTYPE был установлен в локаль UTF-8. Никакие сбитые или разделенные пробелы.

Ответ 3

Используйте grep, например:

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

или fold:

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

Ответ 4

Использование разделителей полей ввода и вывода awk:

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

или Perl

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

Ответ 5

Не меньше, чем PaulP.R.O. answer, но полезно, если вы хотите выполнить некоторую операцию над каждым символом:

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"