Вы можете использовать sed
«s w
флаг либо /dev/stderr
, /dev/tty
, /dev/fd/2
если поддерживается в вашей системе. Например, с помощью ввода file
:
foo first
second: missing
third: foo
none here
Бег
sed -i '/foo/{
s//bar/g
w /dev/stdout
}' file
выходы:
bar first
third: bar
хотя file
содержание было изменено на:
bar first
second: missing
third: bar
none here
Итак, в вашем случае работает:
find . -type f -printf '\n%p:\n' -exec sed -i '/foo/{
s//bar/g
w /dev/fd/2
}' {} \;
отредактируем файлы на месте и выведем:
./file1:
барные вещи
больше бар
./file2:
./file3:
бар первым
третье: бар
Вы также можете напечатать что-то вроде, original line >>> modified line
например:
find . -type f -printf '\n%p:\n' -exec sed -i '/foo/{
h
s//bar/g
H
x
s/\n/ >>> /
w /dev/fd/2
x
}' {} \;
редактирует файлы на месте и выводит:
./file1:
Foo вещи >>> бар вещи
больше foo >>> больше бар
./file2:
./file3:
foo first >>> сначала бар
третье: foo >>> третье: бар
for x in `find . -type f`; do echo ///File $x: ; sed --quiet 's/abc/def/gp' $x; done
sed
выражений, я не хочу писать/gp
для каждого. Как установить это глобально?Я не думаю, что это возможно, но обходной путь может заключаться в использовании вместо Perl:
Это выведет измененные строки к стандартной ошибке. Например:
Вы также можете сделать это немного сложнее, напечатав номер строки, имя файла, исходную строку и измененную строку:
источник
$ARGV
имя файла, с которым вы работаете.perl
синтаксис очень похож на синтаксис,sed
и я не думаю, что то, о чем вы просите, действительно возможноsed
.Это возможно с помощью флага w, который записывает текущий файл в файл. Таким образом, добавив его в команду замены, мы можем сообщить о последовательных заменах в файл и распечатать его после завершения работы. Мне также нравится раскрашивать замененную строку с помощью grep.
Обратите внимание, что между w и именем файла должен быть только один пробел .
Это даже лучше, чем diff, поскольку diffing также может показывать изменения, даже если они не были сделаны sed.
источник
sed.done
. Поэтому строки с «Кому» в исходном файле не печатаютсяsed.done
, поэтому, когдаgrep "To" sed.done
вы увидите только те строки, которые были измененыsed
. Вы не увидите исходную строку в файле, прежде чем она будет заменена, если вы к этомуМне нравится решение @terdon - Perl хорош для этого.
Вот моя подправленная версия:
код
пример вывода
источник