С GNU awk для 3-го аргумента для сопоставления () и -i inplace
для редактирования "на месте" вам просто нужна одна команда:
$ cat tst.awk
BEGIN { srand(seed) }
(FNR==1) && match($0,/(.*value1=).*(value2=.*)/,a) {
$0 = a[1] "sevens.eighteen." int(10000000000000000000 + rand()*90000000000000000000) a[2]
}
{ print }
$ awk -i inplace -v seed="$RANDOM" -f tst.awk *
Например:
$ awk -v seed="$RANDOM" -f tst.awk file
aaa bbbbb cccc value1=sevens.eighteen.77242153065798582272value2=yyyy
body body body
body body body
body body body
aaa bbbbb cccc value1=xxxx
$ awk -v seed="$RANDOM" -f tst.awk file
aaa bbbbb cccc value1=sevens.eighteen.59551444957943291904value2=yyyy
body body body
body body body
body body body
aaa bbbbb cccc value1=xxxx
Обратите внимание, что приведенное выше будет работать только в первой строке каждого входного файла, поэтому даже если регулярное выражение совпадает с другой строкой, оно не будет изменено.
Я вижу, вы задали другой идентичный вопрос, отличный от того, который вы хотитесделать это для первой и последней строк.Просто переместите код, который меняет $ 0, в функцию, так как вам нужно будет вызвать ее дважды сейчас и сохранить / изменить предыдущую строку, а не текущую, чтобы у вас была последняя строка для работы в ENDFILE (также расширение GNU awk):
$ cat file
aaa bbbbb cccc value1=xxxxxvalue2=yyyy
body body body
body body body
body body body
aaa bbbbb cccc value1=xxxx,value2=yyyy
$ cat tst.awk
BEGIN { srand(seed) }
NR==1 { fmt() }
NR > 1 { print prev }
{ prev = $0 }
ENDFILE { fmt(); print }
function fmt() {
if ( match($0,/(.*value1=).*(value2=.*)/,a) ) {
$0 = a[1] "sevens.eighteen." int(10000000000000000000 + rand()*90000000000000000000) a[2]
}
}
$ awk -v seed="$RANDOM" -f tst.awk file
aaa bbbbb cccc value1=sevens.eighteen.55152151176931606528value2=yyyy
body body body
body body body
body body body
aaa bbbbb cccc value1=sevens.eighteen.98796005800472494080value2=yyyy