Способ Perl. По сути это то же самое, что и MikeV's sed
ответ:
perl -pe 's/.*(consectetuer.*elit).*./$1/' file
-p
означает "вывести каждую строку после применения сценария, заданного с помощью -e
". s/foo/bar/
- это оператор подстановки; он заменит foo
на bar
. Круглые скобки фиксируют шаблон и позволяют нам использовать его в замене. Первый захваченный шаблон - $1
, второй $2
и так далее.
Итак, команда сопоставит все до consectetuer
(.*consectetuer
), затем все до elit
(.*elit
), а затем все остальное до конца строки (.*
) и заменит это на захваченный шаблон.
Было бы более элегантно сделать все это в awk
, но если вы хотите что-то быстрое и грязное, вы можете просто установить разделитель записей awk
равным разделителю групп grep
-, а затем напечатайте поля с разделителями пробелами -, которые вы хотите, в том порядке, в котором вы хотите:
grep -C1 XYZ file | awk -vRS='\n--' '{print $1, $NF, $3, $2}'
ABCD1 1234597890 12345 1234
DEFG2 0987654321 56789 5678