Vous pouvez utiliser sed
de » w
drapeau soit /dev/stderr
, /dev/tty
, /dev/fd/2
si pris en charge sur votre système. Par exemple avec une entrée file
comme:
foo first
second: missing
third: foo
none here
fonctionnement
sed -i '/foo/{
s//bar/g
w /dev/stdout
}' file
les sorties:
bar first
third: bar
bien que le file
contenu ait été changé en:
bar first
second: missing
third: bar
none here
Donc, dans votre cas, exécutez:
find . -type f -printf '\n%p:\n' -exec sed -i '/foo/{
s//bar/g
w /dev/fd/2
}' {} \;
éditera les fichiers sur place et produira:
./fichier1:
trucs de bar
plus de bar
./fichier2:
./file3:
bar d'abord
troisième: bar
Vous pouvez également imprimer quelque chose comme original line >>> modified line
par exemple:
find . -type f -printf '\n%p:\n' -exec sed -i '/foo/{
h
s//bar/g
H
x
s/\n/ >>> /
w /dev/fd/2
x
}' {} \;
édite les fichiers sur place et les sorties:
./fichier1:
trucs de foo >>> trucs de bar
plus de foo >>> plus de bar
./fichier2:
./file3:
foo first >>> bar first
troisième: foo >>> troisième: bar
for x in `find . -type f`; do echo ///File $x: ; sed --quiet 's/abc/def/gp' $x; done
sed
expressions, je ne veux pas écrire/gp
pour chacune. Comment le définir globalement?Je ne pense pas que ce soit possible, mais une solution de contournement pourrait être d'utiliser à la place perl:
Cela imprimera les lignes modifiées à l'erreur standard. Par exemple:
Vous pouvez également rendre cela légèrement plus complexe, en imprimant le numéro de ligne, le nom du fichier, la ligne d'origine et la ligne modifiée:
la source
$ARGV
pour le nom du fichier utilisé.perl
la syntaxe de est très similaire à celle desed
et je ne pense pas que ce que vous demandez soit réellement possible avecsed
.Il est possible d'utiliser l' indicateur w qui écrit le modèle actuel dans un fichier. Ainsi, en l'ajoutant à la commande de substitution, nous pouvons signaler des substitutions successives dans un fichier et l'imprimer une fois le travail terminé. J'aime aussi coloriser la chaîne remplacée par grep.
Notez qu'il ne doit y avoir qu'un seul espace entre le w et son nom de fichier.
C'est encore mieux que diff, car diffing peut également montrer des changements même s'ils n'ont pas été faits par sed.
la source
sed.done
. Les lignes avec « To » dans le fichier d' origine ne sont donc pas à imprimersed.done
, donc lorsque vousgrep "To" sed.done
vous ne verrez que les lignes qui sont modifiés parsed
. Vous ne verrez pas la ligne d'origine dans le fichier avant sa substitution, si c'est ce que vous visez ...J'aime la solution @terdon - perl est bon pour cela.
Voici ma version modifiée qui:
code
exemple de sortie
la source