如何使用 tr 命令替换:句号、感叹号和问号,后跟空格和换行符?

如何使用 tr 命令替换:句号、感叹号和问号,后跟空格和换行符?

我有这样的文字:

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。使用trwith .␣(一个点和一个空格) 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仅适用于单个角色”。”是字符串而不是字符,因此可以使用sedor执行您想要的操作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() 函数重新组装。

相关内容