14 ch4.3
17 ch4.4
2 ch4.9
$
Можно использовать sed
* и табуляции от обработки интерпретатором:$ du -a ch4.* | sed 's/.*→//'
ch4.1
ch4.2
ch4.3
ch4.4
ch4.9
$
В команде замены удаляются все символы (.*
→). Аналогичным способом можно выделить из вывода команды who имена пользователей и время входа в систему:$ who
lr tty1 Sep 29 07:14
ron tty3 Sep 29 10:31
you tty4 Sep 29 08:36
td tty5 Sep 29 08:47
$ who | sed 's/ .* / /'
lr 07:14
ron 10:31
you 08:36
td 08:47
$
Команда s
Почти такую же команду sed
getname, возвращающую имя пользователя:$ cat getname
who am i | sed 's/ .*//'
$ getname
you $
Другая команда sed
ind. Эта команда вставляет пробелы до шага табуляции; она удобна для лучшего расположения текста при печати.Реализовать команду ind
$ sed 's/^/→/' $*
В этой версии символ табуляции вставляется даже в пустую строку, что не требуется. В лучшей версии используется возможность sed
sed '/./s/^/→/' $*
Шаблон /./
s не выполняется для пустых строк. Вспомним, что sed выдает все строки, независимо от того, менялись они или нет, так что пустые строки по-прежнему выдаются.Есть еще один способ определения команды ind
'!'. В командеsed '/^$/!s/^/→/' $*
шаблон /^$/
/^$/! предписывает не выполнять команду для пустых строк.Как уже отмечалось, sed
ed. Поэтому легко составить программу sed, которая напечатает, скажем, три первых строки входного потока, а затем завершится:sed 3q
Хотя 3q
ed, для sed она имеет смысл: копировать строки и завершить выполнение после третьей.От вас может потребоваться другая работа с данными, например вставка пробелов. Один из способов заключается в том, чтобы выходной поток sed
ind, но поскольку редактор sed допускает несколько команд, можно сделать это путем одного обращения к sed (хотя и несколько необычного):sed 'S/^/→/
3q'
Обратите внимание, где находятся кавычки и символ перевода строки: команды должны быть на отдельных строках, но редактор игнорирует пробелы и символы табуляции в начале строки.
Представляется естественным с помощью рассмотренных выше приемов составить программу head
sed 3q (или 10q) настолько просто задать, что в этом никогда не возникало потребности. Однако мы ввели команду ind, так как соответствующая последовательность для sed длиннее. (В процессе работы над книгой мы заменили существовавшую программу на языке Си в 30 строк на одну строку команды ind версии 2, приведенной выше.) Четкого критерия в отношении того, когда имеет смысл создавать отдельную программу из сложной командной строки, нет, поэтому мы предлагаем вам свое решение: поместите программу в свой каталог /bin и посмотрите, будете ли вы ее действительно применять.Можно помещать команды редактора sed
$ sed -f командный_файл
Вы можете обращаться к строкам, используя не только их номера. Так, команда
$ sed '/шаблон/q'
выдает из входного потока все строки до первой включительно, которые соответствуют шаблону, а команда
$ sed '/шаблон/d'
удаляет каждую строку, содержащую шаблон; удаление происходит до автоматического вывода строк, поэтому удаленные строки не учитываются.