Ответ 1
Используя tr:
tr -s '[[:punct:][:space:]]' '\n' < file
Я делаю более быстрые тесты для наивной логической системы восстановления информации, и я бы хотел использовать awk, grep, egrep, sed или thing similiar и pipe для разделения текстового файла на слова и сохранения их в другой файл с помощью слово в строке. Пример моего файла cotains:
Hola mundo, hablo español y no sé si escribí bien la
pregunta, ojalá me puedan entender y ayudar
Adiós.
Выходной файл должен содержать:
Hola
mundo
hablo
español
...
Спасибо!
Используя tr:
tr -s '[[:punct:][:space:]]' '\n' < file
Использование sed
:
$ sed -e 's/[[:punct:]]*//g;s/[[:space:]]\+/\n/g' < inputfile
в основном это удаляет все знаки препинания и заменяет любые пробелы символами новой строки. Это также предполагает, что ваш вкус sed
понимает \n
. В некоторых случаях нет - в этом случае вы можете просто использовать литеральную новую строку вместо этого (т.е. Вставляя ее в свои кавычки).
grep -o
печатает только части соответствующей строки, соответствующие шаблону
grep -o '[[:alpha:]]*' file
Простейшим инструментом является fmt:
fmt -1 <your-file
fmt предназначен для разбиения строк на заданную ширину, и если вы предоставляете -1
, он прерывается сразу после слова. См. man fmt
для документации. Вдохновленный http://everythingsysadmin.com/2012/09/unorthodoxunix.html
cat input.txt | tr -d ",." | tr " \t" "\n" | grep -e "^$" -v
tr -d ",." удаляет "," и "."
tr "\ t" "\n" изменяет пробелы и вкладки на новые строки
grep -e "^ $" -v удаляет пустые строки (в случае двух или более пробелов)
эта строка awk тоже может работать?
awk 'BEGIN{FS="[[:punct:] ]*";OFS="\n"}{$1=$1}1' inputfile
Основываясь на ваших ответах до сих пор, я ДУМАЮ, что вы, вероятно, ищете, - это рассматривать слова как последовательности символов, разделенные пробелами, запятыми, символами конца предложения (например, "." "!" или "?" на английском языке ) и другие символы, которые вы обычно не находите в комбинации с буквенно-цифровыми символами (например, "<" и ";", но не '
-
#
$
%
). Теперь, "." это символ окончания предложения, но вы сказали, что $27.00
следует рассматривать как "слово", поэтому .
нужно обрабатывать по-разному в зависимости от контекста. Я думаю, что то же самое, вероятно, верно для "-" и, возможно, некоторых других персонажей.
Итак, вам нужно решение, которое будет конвертировать это:
I have $27.00. We're 20% under-budget, right? This is #2 - mail me at "[email protected]".
в это:
I
have
$27.00
We're
20%
under-budget
right
This
is
#2
mail
me
at
[email protected]
Правильно ли это?
Попробуйте использовать GNU awk, чтобы мы могли установить RS более чем на один символ:
$ cat file
I have $27.00. We're 20% under-budget, right? This is #2 - mail me at "[email protected]".
$ gawk -v RS="[[:space:]?!]+" '{gsub(/^[^[:alnum:]$#]+|[^[:alnum:]%]+$/,"")} $0!=""' file
I
have
$27.00
We're
20%
under-budget
right
This
is
#2
mail
me
at
[email protected]
Попробуйте придумать некоторые другие тестовые примеры, чтобы убедиться, что это всегда делает то, что вы хотите.
Самый простой вариант:
sed 's,\(\w*\),\1\n,g' file
Остерегайтесь, чтобы он не обрабатывал ни апострофы, ни знаки препинания.
Использование perl
:
perl -ne 'print join("\n", split)' < file
Использование perl:
perl -pe 's/(?:\p{Punct}|\s+)+/\n/g' file
Hola
mundo
hablo
español
y
no
sé
si
escribí
bien
la
pregunta
ojal�
me
puedan
entender
y
ayudar
Adiós
perl -ne 'print join ( "\n" , split)'
Извините @jsageryd
Этот один вкладыш не дает правильного ответа, поскольку он соединяет последнее слово в строке с первым словом в следующем.
Это лучше, но создает пустую строку для каждой пустой строки в src. Труба через | sed '/^ $/d', чтобы зафиксировать, что
perl -ne '{print join ( "\n" , split (/[[: ^ word:]] +/)), "\n" ; } '