Ответ 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 '\\\\' "\\\\"
\\\\ \\
То есть оболочка применяет различные правила экранирования к строкам с одним кадром по сравнению с строками с двойными кавычками. Обычно вы хотите защитить все обратные косые черты, обычные в регулярных выражениях с одинарными кавычками.