Можете ли вы объяснить этот седан с одним вкладышем? - PullRequest
4 голосов
/ 30 марта 2012

Следующая строка выводит содержимое файла в обратном порядке

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

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

  • n flag
  • 1!
  • G
  • h
  • и $p

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

Ответы [ 2 ]

6 голосов
/ 30 марта 2012

Это сделает ту же работу, что и 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

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

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

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

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

5 голосов
/ 30 марта 2012
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

Итак, это означает: полностью измените содержимое вашего файла, насколько я понимаю.


РЕДАКТИРОВАТЬ чтобы добавить пояснения (спасибо potong , см. Его комментарий к оригиналу):

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...