У меня есть простое выражение 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 '^@'