回答:
あなたは使用することができますsed
の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のもの>>>バーのもの more foo >>> more bar ./file2: ./file3: foo first >>> bar first 3番目:foo >>> 3番目:bar
私はそれが可能だとは思いませんが、回避策は代わりにperlを使用することです。
find . -type f | xargs perl -i -ne 's/abc/def/ && print STDERR'
これにより、変更された行が標準エラーに出力されます。例えば:
$ cat foo
fooabcbar
$ find . -type f | xargs perl -i -ne 's/abc/def/ && print STDERR'
foodefbar
行番号、ファイル名、元の行、変更された行を印刷して、これを少し複雑にすることもできます。
$ find . -type f |
xargs perl -i -ne '$was=$_; chomp($was);
s/abc/def/ && print STDERR "$ARGV($.): $was : $_"'
./foo(1): fooabcbar : foodefbar
$ARGV
操作対象のファイルの名前にも使用できます。
perl
は、構文はの構文に非常に似てsed
いるため、実際にを使用して求めることができるとは思いませんsed
。
現在のパターンをファイルに書き込むwフラグを使用することができます。したがって、それを代替コマンドに追加することで、連続した置換をファイルに報告し、ジョブの完了後に印刷できます。また、置き換えられた文字列をgrepで色付けすることも好きです。
sed -i -e "s/From/To/gw /tmp/sed.done" file_name
grep --color -e "To" /tmp/sed.done
wとそのファイル名の間にスペースが1つだけあることに注意してください。
diffはsedで作成されたものではない場合でも変更を示す場合があるため、これはdiffよりも優れています。
sed.done
。元のファイルで「へ」との行は、そのために印刷されていないsed.done
あなたときので、grep "To" sed.done
あなただけの行が表示されますされていることで変更をsed
。それがあなたが目指しているものである場合、それが置換される前にファイルに元の行が表示されません
私は@terdonソリューションが好きです-perlはこれに適しています。
これが私の調整バージョンです:
コード
find /tmp/test -type f ! -name "*.bak" -exec grep -l '/opt/gridmon' {} \; | xargs -L1 perl -ni'.bak' -e'$old=$_; s/\/opt\/gridmon/~/g && print STDERR "$ARGV($.):\n\tOLD:$old\tNEW:$_"'
出力例
/tmp/test/test4.cfg(13):
OLD: ENVFILE /opt/gridmon/server/etc/gridmonserver.cfg
NEW: ENVFILE ~/server/etc/gridmonserver.cfg
/tmp/test/test4.cfg(24):
OLD: ENVFILE /opt/gridmon/server/etc/gridmonserver.cfg
NEW: ENVFILE ~/server/etc/gridmonserver.cfg
for x in `find . -type f`; do echo ///File $x: ; sed --quiet 's/abc/def/gp' $x; done