От подчеркиваний по умолчанию у меня болят глаза. Эта настройка значительно улучшает чтение страниц man
:
Добавьте следующее в ваш `~.bashrc':
# Have less display colours
# from: https://wiki.archlinux.org/index.php/Color_output_in_console#man
export LESS_TERMCAP_mb=$'\e[1;31m' # begin bold
export LESS_TERMCAP_md=$'\e[1;33m' # begin blink
export LESS_TERMCAP_so=$'\e[01;44;37m' # begin reverse video
export LESS_TERMCAP_us=$'\e[01;37m' # begin underline
export LESS_TERMCAP_me=$'\e[0m' # reset bold/blink
export LESS_TERMCAP_se=$'\e[0m' # reset reverse video
export LESS_TERMCAP_ue=$'\e[0m' # reset underline
export GROFF_NO_SGR=1 # for konsole and gnome-terminal
Для победы, сочетайте с export MANPAGER='less -s -M +Gg'
(source) для отображения вашего процента в документе.
Очень хороший вопрос! Я думаю, ключ вот в чем:«Таким образом, программа, показанная в начале этого раздела , могла бы быть написана таким же образом :»
Не обязательно писать таким образом. Это своего рода альтернативный способ. Это означает (и было доказано в действии ), что оба приведенных ниже утверждения верны:
$ awk '/12/ { print $0 } /21/ { print $0 }' file
$ awk '/12/ { print $0 } ; /21/ { print $0 }' file
Я думаю, что эта точка с запятой предназначена для очень короткого -идиоматического кода, например, в случаях, когда мы опускаем часть действия и хотим применить несколько правил в одной строке:
$ awk '/12//21/' file
awk: cmd. line:2: /12//21/
awk: cmd. line:2: ^ unexpected newline or end of string
В этом случае использование точки с запятой обязательно для разделения правил (=условия):
$ awk '/12/;/21/' file
Поскольку часть {action}
опущена в обоих правилах/оба условиях, действие по умолчанию будет выполняться для каждого правила ={print $0}
Точка с запятой между условными блоками не обязательна; только точки с запятой между операторами внутри блоков кажутся обязательными:
$ echo -e "foo\nbar" | gawk '/foo/ { print "foo found" } /bar/ {print "bar found"}'
foo found
bar found
$ echo -e "foo\nbar" | gawk '/foo/ { print "foo found" }; /bar/ {print "bar found"}'
foo found
bar found
$ echo -e "foo\nbar" | gawk '/foo/ { print "foo found"; print "whee" }'
foo found
whee
$ echo -e "foo\nbar" | gawk '/foo/ { print "foo found" print "whee" }'
gawk: cmd. line:1: /foo/ { print "foo found" print "whee" }
gawk: cmd. line:1: ^ syntax error
Однако, когда фактический блок кода между двумя условными операторами опущен в пользу стандартного (i. е. {print}
),точка с запятой становится необходимой:
$ echo -e "foo\nbar" | gawk '/foo/ /bar/'
gawk: cmd. line:2: /foo/ /bar/
gawk: cmd. line:2: ^ unexpected newline or end of string
$ echo -e "foo\nbar" | gawk '/foo/; /bar/'
foo
bar
В gawk эти две цитаты из руководства описывают проблему:
An action consists of one or more awk statements, enclosed in braces (‘{…}’). Each statement specifies one thing to do. The statements are separated by newlines or semicolons.
Точка с запятой является " разделителем ", но не " терминатором ".
Единственным допустимым терминатором действия является закрывающая фигурная скобка(}
).
Следовательно, то, что следует за закрывающей скобкой действия (}
), должно быть другим шаблоном {действие}
В "man mawk " есть другое описание, которое может помочь прояснить, что должен делать awk:
Statements are terminated by newlines, semi-colons or both. Groups of statements such as actions or loop bodies are blocked via {... } as in C. The last statement in a block doesn't need a terminator.
«Человек наук » объясняет это так:
The pattern comes first, and then the action. Action statements are enclosed in { and }.
И, если вы хотите остановиться на деталях, прочтите описание POSIX:
action : '{' newline_opt '}'
| '{' newline_opt terminated_statement_list '}'
| '{' newline_opt unterminated_statement_list '}'
;
И найдите то, что является «незавершенным» списком операторов.
Или, проще, найдите Действие , чтобы прочитать:
Any single statement can be replaced by a statement list enclosed in curly braces. The application shall ensure that statements in a statement list are separated by <newline> or <semicolon> characters.
Снова:are separated by <newline> or <semicolon> characters