Хотя автоматический вывод обычно удобен, иногда он мешает. Его можно отключить с помощью флага -n
$ sed -n '/шаблон/p'
эквивалентен команде grep
!, поэтому$ sed -n '/шаблон/!p'
эквивалентно команде grep -v
sed '/шаблон/d'.)Для чего нужны две команды sed
grep? В конце концов, grep — всего лишь частный случай команды sed. Это в какой-то степени объясняется историческими причинами: команда grep появилась намного раньше, чем команда sed. Но она не только уцелела, но и активно применялась. В силу специфики назначения обеих команд grep значительно проще использовать, чем команду sed, так как ее использование в типичных ситуациях настолько лаконично, насколько возможно (к тому же у нее есть возможности, отсутствующие у команды sed; см., например, описание флага -b). Но все-таки программы могут "умирать". Когда-то была программа с именем gres, выполняющая простую подстановку, но она исчезла почти мгновенно, когда появилась команда sed.Используя запись, такую же, как в редакторе ed
sed:$ sed '/$/\
> /'
Здесь добавляется символ перевода строки к каждой строке, и таким образом пустые строки вставляются во входной поток, а команда
$ sed 's/[→][→]*/\
>/g'
заменяет каждую последовательность пробелов или символов табуляции на символ перевода строки, т. е. разбивает входной поток на строки из одного слова. (Регулярное выражение '[→]'
'[→]*' задает нуль или более таких символов, а весь шаблон — один или более пробелов и/или символов табуляции.)Можно также использовать пару регулярных выражений или номеров строк для задания диапазона строк, к которому будет применяться произвольная команда.
$ sed -n '20,30p'
$ sed '1,10d'
$ sed '1,/^$/cd'
$ sed -n '/^$/,/^end/p'
строки, начинающейся с end
$ sed '$d'
Строки нумеруются с начала входного потока; обнуление не происходит с началом нового файла.
У команды sed
ed: в ней поддерживается относительная нумерация строк. В частности, операции + и - не действуют в выражениях, задающих номера строк, поэтому невозможно двигаться назад во входном потоке:$ sed '$-1d'
Unrecognized command: $-1d
$
Если строка считана, предыдущая исчезла навсегда: нет способа специфицировать предыдущую строку, а именно это требуется в команде. В принципе такой способ есть в команде sed
hold в справочном руководстве по UNIX.) Невозможна и относительная прямая адресация:$ sed '/что-то/+1d'
Редактор sed
$ sed -n '/шабл/w файл1
> /шабл/!w файл2' имена_файлов...
$
записывает строки, соответствующие "шабл"
файл1, а не соответствующие — в файл2, или, если вернуться к нашему первому примеру:$ sed 's/\UNIX(TM)/gw u.out' имена_файлов...> выход
то здесь, как и ранее, весь выходной поток записывается в файл "выход"
u.out.Иногда нужна помощь со стороны интерпретатора, чтобы в команду редактора включить аргументы командного файла. Одним из примеров служит программа newer
$ cat newer
# newer f: список файлов, созданных после f
ls -t | sed '/'$1'$/q'
$
Кавычки защищают различные специальные символы, предназначенные для редактора, оставляя $1
"/^$1\$/q"
так как $1
\$ становится просто $.Аналогично можно составить программу older
$ cat older
# older f: список файлов, созданных ранее f
ls -tr | sed '/'$1'$/q'
$
Единственное различие состоит в применении флага -r
ls для изменения порядка выдачи файлов.