perl -pe 'BEGIN{$/=""}
s/^(NAME#AAAA.*\n)(AGE.*?)(\n+)$/#$2\n$1AGE NIL$3/s' ex1
очень краткие пояснения:
For all the registers in input | perl -p
separator= one or more empty lines | BEGIN{$/=""}
do:
| substitute | s/
| ^(NAME AAAA.*\n)(AGE.*?)(\n+)$ | regex /
| 1 2 3 |
| by | /subst. string including
| # $2 \n $1 AGE NIL $3 | capture groups/
| |
| and print | ...from option -p
Обновление:
Можно ли использовать переменные вместо NAME # AAAA?
perl -pe '
BEGIN{
$/="";
$f=shift; }
s/^(NAME#$f.*\n)(AGE.*?)(\n+)$/#$2\n$1AGE NIL$3/s' AAAA ex1
В этой версии мы должен предоставить аргумент шаблон (например: «AAAA»):
Есть два потока вывода от процесса, которые обычно отправляются на терминал: стандартный вывод (который привязан к файловому дескриптору 1) и стандартный поток ошибок. (который привязан к файловому дескриптору 2). Это позволяет легко разделить ожидаемый результат и сообщения об ошибках или другую диагностическую информацию, которая обычно не ожидается.
Когда вы используете перенаправление (>
), оно запускает только стандартный вывод в указанный файл или место, оставляя стандартную ошибку нетронутой. Это позволяет вам увидеть, есть ли ошибки (например, те, которые вы видите).
Если вы хотите отправить весь вывод, включая стандартную ошибку, вам необходимо перенаправить оба потока:
/path/to/program arg1 arg2 > /dev/null 2>&1
Или, альтернативно, но более явно:
/path/to/program arg1 arg2 > /dev/null 2> /dev/null
Синтаксис 2> & 1
означает «Отправить вывод в настоящее время идет к файловому дескриптору 2 в то же место, куда идет вывод, идущий в файловый дескриптор 1 ".>
опускает значение по умолчанию для FD1, поэтому семантически оно совпадает с 1>
, что может сделать 2>
более понятным.