Один из вариантов в bash — сделать это путем перенаправления на процесс замены, что-то вроде этого:
./script.sh > >(sed 's/^/script: /') 2> >(sed 's/^/script (err): /' >&2)
Проблема в том, что вывод может быть не в порядке (, как упоминал Чарльз Даффи в комментарии ). Это также действительно раздражающе громоздко. Но вы можете сделать для него функцию-оболочку:
prefixwith() {
local prefix="$1"
shift
"$@" > >(sed "s/^/$prefix: /") 2> >(sed "s/^/$prefix (err): /" >&2)
}
prefixwith "From script"./script.sh
Или сделать это еще проще, используя имя команды в качестве префикса:
prefixoutput() {
local prefix="From ${1##*/}"
"$@" > >(sed "s/^/$prefix: /") 2> >(sed "s/^/$prefix (err): /" >&2)
}
prefixoutput./script.sh
Я нашел решение с этим кодом:
awk '/COI-5P/{nr[NR]; nr[NR+1]}; NR in nr' oldfile > newfile
где
/COI-5P/{nr[NR]; nr[NR+1]}
записать совпадающую строку и последующие NR in nr
выбор и неявная печать записанных строк.