Я пытаюсь использовать список вокала для греческого текста, который мы переводим в классе. Я хочу заменить каждый пробел или символ табуляции знаком абзаца, чтобы каждое слово появлялось в отдельной строке. Может ли кто-нибудь дать мне команду sed и объяснить, что я делаю? Я все еще пытаюсь понять, как выжить.
Замените все пробелы меткой разрыва строки/абзаца, чтобы сделать список слов
Ответ 1
Для разумно современных версий sed отредактируйте стандартный ввод, чтобы получить стандартный вывод с помощью
$ echo 'τέχνη βιβλίο γη κήπος' | sed -E -e 's/[[:blank:]]+/\n/g'
τέχνη
βιβλίο
γη
κήπος
Если ваши словарные слова находятся в файлах с именем lesson1 и lesson2, перенаправить seds стандартный вывод в файл all-vocab с помощью
sed -E -e 's/[[:blank:]]+/\n/g' lesson1 lesson2 > all-vocab
Что это значит:
-  Класс символов 
[[:blank:]]соответствует либо одиночному пробелу, либо один символ табуляции.-  Используйте 
[[:space:]]вместо того, чтобы соответствовать любому одиночному символу пробела (обычно пробел, вкладка, новая строка, возврат каретки, форма-фид и вкладка с вертикальной вкладкой). -  Коэффициент 
+означает соответствие одному или нескольким предыдущим шаблонам. -  Итак 
[[:blank:]]+- это последовательность из одного или нескольких символов, которые являются пробелом или вкладкой. 
 -  Используйте 
 -  
\nв замене - это новая строка, которую вы хотите. -  Модификатор 
/gна конце означает выполнение замены как можно чаще, а не только один раз. -  Опция 
-Eуказывает sed использовать синтаксис расширенного регулярного выражения POSIX и, в частности, для этого случая квантор+. Без-Eваша команда sed станетsed -e 's/[[:blank:]]\+/\n/g'. (Обратите внимание на использование\+, а не на простое+.) 
Perl Compatible Regexes
Для тех, кто знаком с Perge-совместимыми регулярными выражениями и sed с поддержкой PCRE, используйте \s+ для соответствия прогонам хотя бы одного символа пробела, как в
sed -E -e 's/\s+/\n/g' old > new
или
sed -e 's/\s\+/\n/g' old > new
Эти команды читают ввод из файла old и записывают результат в файл с именем new в текущем каталоге.
Максимальная переносимость, максимальная крутизна
Возвращаясь к почти любой версии sed с Версия 7 Unix, вызов команды немного больше барокко.
$ echo 'τέχνη βιβλίο γη κήπος' | sed -e 's/[ \t][ \t]*/\
/g'
τέχνη
βιβλίο
γη
κήπος
Примечания:
-  Здесь мы даже не предполагаем существование скромного квантора 
+и имитируем его с помощью единственного пробела-или-tab ([ \t]), за которым следует ноль или более ([ \t]*). -  Аналогично, если sed не понимает 
\nдля новой строки, мы должны включить его в командную строку дословно.-  
\и конец первой строки команды является маркером продолжения, который выходит из следующей строки новой строки, а оставшаяся часть команды находится на следующей строке.- Примечание. Не должно быть пробелов, предшествующих экранированной новой строке. То есть, конец первой строки должен быть точно обратным слэшем, за которым следует конец строки.
 
 - Этот процесс, подверженный ошибкам, помогает понять, почему мир перемещается к видимым символам, и вы захотите проявить осторожность при попытке выполнить команду с копированием и вставкой.
 
 -  
 
Указание на обратную косую черту и цитирование
Команды выше всех использовали одиночные кавычки (''), а не двойные кавычки (""). Рассмотрим:
$ echo '\\\\' "\\\\"
\\\\ \\
То есть оболочка применяет различные правила экранирования к строкам с одним кадром по сравнению с строками с двойными кавычками. Обычно вы хотите защитить все обратные косые черты, обычные в регулярных выражениях с одинарными кавычками.
Ответ 2
Портативный способ сделать это:
sed -e 's/[ \t][ \t]*/\
/g'
Это фактическая строка новой строки между обратным слэшем и косой чертой. Многие реализации sed не знают о \n, поэтому вам нужна буквальная новая строка. Обратная косая черта перед новой строкой запрещает sed расстраиваться по поводу новой строки. (в сценариях sed команды обычно заканчиваются символами новой строки)
С помощью GNU sed вы можете использовать \n в подстановке и \s в регулярном выражении:
sed -e 's/\s\s*/\n/g'
GNU sed также поддерживает "расширенные" регулярные выражения (стиль egrep, а не perl-style), если вы даете ему флаг -r, поэтому вы можете использовать +:
sed -r -e 's/\s+/\n/g'
Если это только для Linux, вы, вероятно, можете пойти с помощью команды GNU, но если вы хотите, чтобы это работало в системах с не-GNU sed (например: BSD, Mac OS-X), вам может понадобиться с более переносимым вариантом.
Ответ 3
Все приведенные выше примеры для sed break на одной платформе или другой. Ни один из них не работает с версией sed, отправленной на Mac.
Однако регулярное выражение Perl работает на любом компьютере с установленным Perl:
perl -pe 's/\s+/\n/g' file.txt
Если вы хотите сохранить вывод:
perl -pe 's/\s+/\n/g' file.txt > newfile.txt
Если вам нужны только уникальные вхождения слов:
perl -pe 's/\s+/\n/g' file.txt | sort -u > newfile.txt
		Ответ 4
Это должно сделать работу:
sed -e 's/[ \t]+/\n/g'
 [ \t] означает пробел ИЛИ вкладку. Если вы хотите любое пространство, вы также можете использовать \s.
 [ \t]+ означает как можно больше пробелов OR tabs (но, по крайней мере, один)
 s/x/y/ означает замену шаблона x на y (здесь \n - новая строка)
 g в конце означает, что вы должны повторять столько раз, сколько встречается в каждой строке.
Ответ 5
-  
вариант 1
echo $(cat testfile) -  
Вариант 2
tr ' ' '\n' < testfile 
Ответ 6
Вы можете использовать POSIX [[:blank:]] для соответствия горизонтальному символу пробела.
sed 's/[[:blank:]]\+/\n/g' file
или вы можете использовать [[:space:]] вместо [[:blank:]].
Пример:
$ echo 'this  is a sentence' | sed 's/[[:blank:]]\+/\n/g'
this
is
a
sentence
		Ответ 7
Использование gawk:
gawk '{$1=$1}1' OFS="\n" file
		Ответ 8
Вы также можете сделать это с помощью xargs:
cat old | xargs -n1 > new
или
xargs -n1 < old > new