2017-01-07 2 views

ответ

3

Использование Awk

Входной

$ cat f 
     start 
     exit 0 

     status 
     exit 0 

     stop 
     exit 0 

Выходной

$ awk '/exit/ && p {sub($NF,"152")}{p=/status/}1' f 
     start 
     exit 0 

     status 
     exit 152 

     stop 
     exit 0 

Объяснение

  • p=/status/ Установить переменную p верно, когда awk находит статус слова
  • /exit/ && p когда awk находит слово выхода на текущей записи и переменная p оценивает истинный затем

суб (регулярное выражение, замену [, цель ])

Море rch target, которая рассматривается как строка, для самой левой, самой длинной подстроки, соответствующей регулярному выражению regexp. Измените всю строку, заменив замененный текст замененным. Измененная строка становится новым значением цели. Верните количество замещений (ноль или один). Если третий аргумент опущен, то по умолчанию используется и изменяет $0.

  • sub($NF,"152")

Заменитель последнее поле ($NF) с 152 текущей записи, так как третий аргумент не задан, следовательно, по умолчанию $0 изменяется.

  • } 1

1 всегда истинно, она выполняет операцию {print $0}

1
perl -pe's/exit \K\d+/152/ if $f; $f = /status/' 

Использование:

perl -i~ -pe'...' file   # Edit in place with backup 
perl -i -pe'...' file    # Edit in place without backup 
perl -pe'...' file.in >file.out # Read from file 
perl -pe'...' <file.in >file.out # Read from stdin 
+0

Большое спасибо, что об использовании СЭД –

+0

sed для простых подстановок на отдельных линиях, вот и все.Использование sed для чего-либо еще совершенно неуместно, поскольку всегда есть более четкие, эффективные, надежные, переносимые, поддерживаемые, расширяемые и т. Д. Способы делать то, что вы хотите сделать, и для этого потребуется использование тайных языковых конструкций, которые стали устаревшими более 40 лет назад, когда был изобретен awk. –

0

по умолчанию С SED можно использовать:

$ sed '/status/{n;s/0/152/}' input 
     start 
     exit 0 

     status 
     exit 152 

     stop 
     exit 0