Anda bisa menggunakan sed
's w
bendera dengan baik /dev/stderr
, /dev/tty
, /dev/fd/2
jika didukung pada sistem Anda. Misalnya dengan input file
seperti:
foo first
second: missing
third: foo
none here
berlari
sed -i '/foo/{
s//bar/g
w /dev/stdout
}' file
output:
bar first
third: bar
meskipun file
konten diubah menjadi:
bar first
second: missing
third: bar
none here
Jadi dalam kasus Anda, jalankan:
find . -type f -printf '\n%p:\n' -exec sed -i '/foo/{
s//bar/g
w /dev/fd/2
}' {} \;
akan mengedit file di tempat dan keluaran:
./file1:
barang bar
lebih banyak bar
./file2:
./file3:
bar dulu
ketiga: bar
Anda juga dapat mencetak sesuatu seperti original line >>> modified line
misalnya:
find . -type f -printf '\n%p:\n' -exec sed -i '/foo/{
h
s//bar/g
H
x
s/\n/ >>> /
w /dev/fd/2
x
}' {} \;
edit file di tempat dan keluaran:
./file1:
hal-hal foo >>> hal-hal bar
lebih banyak foo >>> lebih banyak bar
./file2:
./file3:
foo dulu >>> bilah dulu
ketiga: foo >>> ketiga: bar
for x in `find . -type f`; do echo ///File $x: ; sed --quiet 's/abc/def/gp' $x; done
sed
ekspresi, saya tidak ingin menulis/gp
untuk masing-masing. Bagaimana cara mengaturnya secara global?Saya tidak berpikir itu mungkin, tetapi solusi mungkin menggunakan perl sebagai gantinya:
Ini akan mencetak garis yang diubah ke kesalahan standar. Sebagai contoh:
Anda juga dapat membuat ini sedikit lebih rumit, mencetak nomor baris, nama file, baris asli dan baris yang diubah:
sumber
$ARGV
nama file yang sedang dioperasikan.perl
sintaksinya sangat mirip dengansed
dan saya tidak berpikir apa yang Anda minta sebenarnya mungkin terjadised
.Dimungkinkan menggunakan flag w yang menulis pola saat ini ke file. Jadi dengan menambahkannya ke perintah pengganti kita dapat melaporkan penggantian berturut-turut ke file dan mencetaknya setelah pekerjaan selesai. Saya juga suka mewarnai string yang diganti dengan grep.
Perhatikan, bahwa harus ada hanya satu ruang antara w dan nama file-nya.
Ini bahkan lebih baik daripada diff, karena diffing juga dapat menunjukkan perubahan meskipun mereka tidak dibuat oleh sed.
sumber
sed.done
. Garis dengan "Untuk" di file asli karena itu tidak dicetak untuksed.done
, sehingga ketika Andagrep "To" sed.done
Anda hanya akan melihat garis-garis yang sedang diubah olehsed
. Anda tidak akan melihat baris asli dalam file sebelum diganti, jika itu yang Anda tuju ...Saya suka solusi @terdon - perl bagus untuk ini.
Inilah versi tweak saya yang:
kode
contoh output
sumber