Для достаточно современных версий sed отредактируйте стандартный ввод, чтобы получить стандартный вывод с помощью
$ echo 'τέχνη βιβλίο γη κήπος' | sed -E -e 's/[[:blank:]]+/\n/g'
τέχνη
βιβλίο
γη
κήπος
Если ваши словарные слова находятся в файлах с именами lesson1
и lesson2
, перенаправьте стандартный вывод sed в файл 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
Для тех, кто знаком с регулярными выражениями, совместимыми с Perl, и 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'
τέχνη
βιβλίο
γη
κήπος
Примечания:
- Здесь мы даже не предполагаем существование скромного квантификатора
+
и моделируем его с помощью одного пробела или табуляции ([ \t]
), за которым следует ноль или более из них ([ \t]*
).
- Точно так же, предполагая, что sed не понимает
\n
для новой строки, мы должны дословно включить его в командную строку.
-
\
и конец первой строки команды являются маркером продолжения, который экранирует непосредственно следующую новую строку, а остальная часть команды находится на следующей строке.
- Примечание: Не должно быть пробелов, предшествующих экранированному символу новой строки. То есть конец первой строки должен быть точно с обратной косой чертой, за которым следует конец строки.
- Этот подверженный ошибкам процесс помогает понять, почему мир перешел на видимые символы, и вам нужно будет проявить некоторую осторожность при попытке выполнить команду с помощью функции копирования и вставки.
Примечание к обратным слешам и кавычкам
Команды выше всех использовали одинарные кавычки (''
), а не двойные кавычки (""
). Рассмотрим:
$ echo '\\\\' "\\\\"
\\\\ \\
То есть оболочка применяет различные правила экранирования к строкам в одинарных кавычках по сравнению со строками в двойных кавычках. Как правило, вы хотите защитить все обратные слеши, встречающиеся в регулярных выражениях, с помощью одинарных кавычек.