Це повертає файл за рядком.
sed '1! g; h; $! d' файл
По-перше, sedє простір утримування та простір візерунка . Ми повинні розрізняти їх, перш ніж концентруватися на цій конкретній команді.
Коли sedчитається новий рядок, він завантажується в простір шаблону. Тому цей простір перезаписується щоразу, коли обробляється новий рядок. З іншого боку, простір утримування є послідовним протягом усієї обробки, і значення можуть зберігатися там для подальшого використання.
До команди:
Є 3 команди в цій заяві: 1!G, hі$!d
1!Gозначає, що Gкоманда виконується в кожному рядку, крім першого ( !заперечує значення 1). Gозначає додавати те, що знаходиться у просторі утримування, у простір шаблону.
hстосується кожного рядка. Він копіює простір шаблону в простір утримування (і перезаписує його).
$!dстосується кожного рядка, крім останнього ( $представляє останній рядок, !заперечує його). dце команда для видалення рядка (пробіл візерунка).
- Тепер, коли читається перший рядок,
sedвиконується hкоманда. Перший рядок копіюється в простір утримування. Потім вона видаляється, оскільки відповідає $!умові. sedпродовжує другий рядок.
- Другий рядок відповідає умові
1!(це не перший рядок), і тому простір утримування (який має перший рядок) додається до простору шаблону (який має другий рядок). Після цього в просторі малюнка є другий рядок, за яким слідує перший рядок, розмежований новим рядком. Тепер hкоманда застосовується (як і в кожному рядку); все, що знаходиться в просторі шаблону, копіюється в простір утримування. Третє твердження ( $!d) застосовується: рядок видаляється з простору шаблонів.
- Крок 2 тепер виконується з усіма рядками. Переходимо до останнього рядка.
- В останньому рядку (
$) майже весь етап 2 виконано, але не частина видалення ( d). sed, при виклику без -n, друкує простір шаблону автоматично в кінці обробки для кожного рядка введення. Отже, коли не видалено, друкується пробіл візерунка. Тепер він містить усі рядки у зворотному порядку .