将每个字符放在一个新行上

时间:2012-03-27 23:15:04

标签: bash

我有一个这样的文件:

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,包含许多非英文字符。
  • 如果空格或回车有自己的行,则无关紧要。

如何将每个字符删除到新行?

5 个答案:

答案 0 :(得分:21)

使用sed将每个字符替换为自身后跟换行符:

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

答案 1 :(得分:12)

  • 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 ''
    • 换行符的空行
    • POSIX指定的read的唯一选项是-r
  • gawk -F '' 'OFS="\n"{$1=$1}1'
    • awk 'BEGIN{FS="";OFS="\n"}{$1=$1}1' in nawk(BSD awk,OS X附带的awk);它不适用于多字节字符
    • 不包括换行符的空行

LC_CTYPE设置为UTF-8语言环境时,除了nawk命令之外的所有命令都在我的环境中使用非ASCII字符。没有折叠或剥离空格。

答案 2 :(得分:9)

使用grep,例如:

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

fold

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

答案 3 :(得分:5)

使用awk的输入和输出字段分隔符:

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

或Perl

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

答案 4 :(得分:3)

不像PaulP.R.O.'s 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"