2012-03-29 6 views
4

Следующие один лайнер печатает содержимое файла в обратномМожете ли вы объяснить это sed-вкладыш?

$ sed -n '1!G;h;$p' test.txt 

Как это возможно, когда СЭД читает файл построчно? Можете ли вы объяснить значение

  • n флаг
  • 1!
  • G
  • h
  • и $p

в этой команде?

+2

http://www.thegeekstuff.com/2009/12/unix-sed-tutorial-7-examples-for-sed-hold-and-pattern-buffer-operations/ – perreal

+0

Почему вы удалили http: // stackoverflow.com/questions/9936151/piping-bash-input-arguments-in-egreps-regular-expression? Я подумал, что это хороший вопрос, и он получил хороший ответ. – sarnold

+1

N.B. альтернативный способ написать это «sed» 1! G; h; $! d'' – potong

ответ

6

Это будет выполнять ту же работу, что и tac, то есть вернуть порядок строк. Переписывая SED сценарий для псевдокода, это означает:

$line_number = 1; 
foreach ($input in $input_lines) { 
    // current input line is in $input 
    if ($line_number != 1)    // 1! 
     $input = $input + '\n' + $hold; // G 

    $hold = $input; // h 

    $line_number++ 
} 

print $input; // $p 

Как вы можете видеть, СЕПГ язык очень выразителен :-) 1! и $ так называемые адреса, которые ставят условия, когда команда должна быть запущена , 1! означает не первый ряд, $ означает в конце. Sed имеет один дополнительный регистр памяти, который называется hold space.

Для получения дополнительной информации введите info sed на консоли linux (это лучшая документация).

-n отключает команду по умолчанию print $input в самом цикле.

Термины pattern space и hold space эквиваленты переменных $input и $hold (соответственно) в этом примере.

+0

Спасибо за ваш ответ! Удивительное объяснение – Alby

+1

Спасибо @Alby - только что добавили примечание относительно опции '-n' и добавили заметку о пространстве шаблонов/удержаний. – TMS

+0

У вашего псевдокода все еще есть сигилы на переменные? Получите профессиональную помощь. :) :) :) – Kaz

5
n flag -> Disable auto-printing. 
1!  -> Any line except the first one. 
G  -> Append a newline and content of 'hold space' to 'pattern space' 
h  -> Replace content of 'hold space' with content of 'pattern space' 
$  -> Last line. 
p  -> print 

Таким образом, это означает: Обратный контент вашего файла, насколько я понимаю.


EDIT добавить некоторые пояснения (спасибо Potong, видеть его комментарий к исходному):

Адреса, как 1 и $ обязаны следующих команд, сгруппированных с помощью {...} или без них. Таким образом, в этом случае 1! применяется к G и $ - p, тогда как h не привязан к адресу и не применяется к всем адресам. То есть $!G и $!{G} - то же самое.

+0

Благодарим вас за ответ. Могу ли я спросить, что такое «пространство удержания» и «пространство шаблонов»? – Alby

+2

@Alby: в 'sed' вы обычно работаете с пространством шаблонов (например, вы делаете замены на пространстве шаблонов), в котором строка, считанная с ввода. Существует также пространство удержания, в котором вы можете явно хранить (удерживать) и извлекать вещи, чтобы разрешить более сложные скрипты sed. – ninjalj

+0

@ninjalj: Спасибо за объяснение, +1 – Birei

Смежные вопросы