답변:
당신은 사용할 수 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 stuff >>> 바 물건 더 많은 foo >>> 더 많은 바 ./file2 : ./file3 : foo first >>> 바 먼저 셋째 : foo >>> 셋째 : 바
나는 그것이 가능하다고 생각하지 않지만 해결 방법은 펄을 대신 사용하는 것일 수 있습니다.
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 와 파일 이름 사이에는 공백이 하나만 있어야합니다 .
diffing은 sed가 수행하지 않은 경우에도 변경 사항을 표시 할 수 있기 때문에 diff보다 낫습니다.
sed.done
. 원본 파일에서 "받는 사람"과 선은 그러므로에 인쇄되지 않습니다 sed.done
당신이 경우에 따라서, grep "To" sed.done
당신은 단지 라인을 볼 수 있습니다 변경을 sed
. 파일 이 대체 되기 전에 파일에 원래 줄이 표시되지 않습니다. 이것이 목표로하는
나는 @terdon 솔루션을 좋아합니다-펄은 이것에 좋습니다.
여기 내 조정 된 버전이 있습니다.
암호
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