Как использовать команду 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 

Но это не работает.

Насколько я знаю, tr работает только с одиночными символами, а «.» – это строка, не являющаяся символом, поэтому вы можете делать то, что хотите, с помощью sed или awk , например:

 sed -e "s/\. /\n/g" file.txt > out.txt 

Вы этого не сделаете. tr не предназначен для этого. Он предназначен для транслитерации набора отдельных символов в другой набор одиночных символов , например AZ в az . Используя tr с .␣ (точка и пробел), а \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 заменит все вхождения ! , . или ? за которым следует пробел, одним и тем же символом и новой линией.

Как уже упоминалось, вы не можете достичь того, чего хотите с 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? 

Здесь нет ничего сложного – мы просто разделяем все строки в файле на предложения . а затем разделите ведущее и конечное пространство для каждого предложения. Все это входит в список, который затем снова .join() через .join() .