2012-03-27 25 views
17

我有一个这样的文件:配售的每个字符在新行

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

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

+0

你想在单独的行或每一个角色每一个字节? – 2012-03-27 23:27:17

+0

LOL我总是有相反的问题,我最终编写了循环,当它们应该在句子中时,它们将每个字符打印在自己的行上:P – 2015-02-03 23:31:54

回答

18

使用SED替换本身每个字符跟着一个换行符:

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

OS X的等价物:'sed -e's/\(。\)/\ 1 \'$'\ n/g'-i''filename' – jkukul 2016-01-02 17:51:01

+1

你能解释一下这个命令吗 – juggernaut1996 2017-01-01 17:44:47

5

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

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

或Perl

perl -F// -lane 'print join "\n", @F' filename 
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" 
8
  • 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'
    • 或在nawk(BSD awk,OS X附带的awk)中的awk 'BEGIN{FS="";OFS="\n"}{$1=$1}1';它不与多字节字符的工作,虽然
    • 也不包括空行的换行符

之外的所有NAWK命令,在我的环境中的非ASCII字符的工作时,LC_CTYPE被设置为UTF-8语言环境。没有折叠或剥离空间。

7

使用grep,例如:

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

fold

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