我有这样的文字:
I am happy. I am here. How are you, Meg?
我希望这是:
I am happy.
I am here.
How are you, Meg?
对于句号,我尝试过
tr -s '. ' '\n' <file.txt >out.txt
但这不起作用。
答案1
你不知道。 tr
不是为此而设计的。它旨在音译一组单个字符进入另一组单个字符,例如,A-Z
进入a-z
。使用tr
with .␣
(一个点和一个空格) and\n
将用换行符替换所有点和空格。
使用 (GNU)sed
代替:
$ echo 'I am happy. I am here. How are you, Meg?' | sed 's/\([!.?]\) /\1\n/g'
I am happy.
I am here.
How are you, Meg?
此处的编辑脚本将用相同的字符和换行符sed
替换所有出现的!
,.
或后面跟有空格的。?
答案2
据我所知tr
仅适用于单个角色”。”是字符串而不是字符,因此可以使用sed
or执行您想要的操作awk
,例如:
sed -e "s/\. /\n/g" file.txt > out.txt
答案3
tr
正如已经提到的,由于 的性质,您无法实现您想要的目标tr
。但还有许多其他选择。例如,Python 2。
作为一句话,我们可以这样做:
python -c "import sys;print '\n'.join([ j.strip() for l in sys.stdin.readlines() for j in l.rstrip().split('.')])" < input.txt
作为脚本,它会像这样:
#!/usr/bin/env python
import sys
sentences = []
for line in sys.stdin:
for sentence in line.rstrip().split('.'):
sentences.append(sentence.strip())
print "\n".join(sentences)
并按如下方式使用:
$ ./split_to_lines.py < input.txt
I am happy
I am here
How are you, Meg?
这里没有发生什么特别复杂的事情 - 我们只是将文件中的所有行分割成句子 at .
,然后去除每个句子的前导和尾随空格。所有这些都进入一个列表,然后通过.join()
函数重新组装。