Назад | Перейти на главную страницу

Как я могу отобразить на консоли изменения, внесенные в выражение sed?

У меня есть простое выражение sed:

sed -i 's/foo/bar/g' blat.xml

Поскольку выражение изменяет файл на месте, трудно увидеть, какие строки были изменены.

Есть ли способ вывести измененные строки на консоль?

Идеально было бы что-то похожее на результат следующего:

sed -n 's/foo/bar/gp' blat.xml

Это характерно для GNU sed:

sed -i 's/foo/bar/gw /dev/stdout' blat.xml

Вы могли бы использовать /dev/stderr вместо.

Не элегантно, но можно использовать без GNU sed. Мы отказываемся от модификации файла на месте и предполагаем, что ни одна из строк не начинается с «@».

sed 's/foo/bar\n@bar/' infile | tee outfile.tmp | grep '^@'
grep -v '^@' outfile.tmp > outfile

Вы можете сделать все это за один шаг с помощью bash, возможно, и с другими оболочками:

sed 's/foo/bar\n@bar/' infile | tee >(grep -v '^@' >outfile) | grep '^@'