sed
아래 예를 사용할 수 없는 이유를 이해하려고 노력 중입니다 .
모든 폴더에 이라는 폴더가 포함된 중첩된 폴더 구조가 있습니다 PKGBUILD
. 예를 들어 특정 패턴을 포함하는 파일의 상대 경로를 인쇄하고 싶습니다.pkgname=.*dbus
find
와 함께 사용 하면 grep
예상되는 결과를 얻습니다.
find . -name 'PKGBUILD' -exec grep -q 'pkgname=.*dbus' {} \; -print
나는 올바르게 얻는다
./packages/dbus-python/repos/extra-x86_64/PKGBUILD
./packages/dbus-python/trunk/PKGBUILD
./packages/dbus-glib/repos/extra-x86_64/PKGBUILD
./packages/dbus-glib/trunk/PKGBUILD
PKGBUILD
해당 파일에만 올바른 패턴이 포함되어 있으므로 상대 파일 경로로 출력됩니다 . 내가 이해한 바에 따르면, -q
grep의 옵션은 일치하는 항목이 없는 한 인쇄를 무시합니다.
하지만 를 사용하여 동일한 동작을 시뮬레이션할 수 있어야 합니다 sed
. 저는 다음과 같이 사용합니다
find . -name 'PKGBUILD' -exec sed -n '/pkgname.*dbus/q' {} \; -print
where 는 출력을 생략하고 일치하는 항목이 발견되면 즉시 종료하는 -n
데 사용됩니다 . q
그러나 명령은 다음을 출력합니다.모든 PKGBUILD
일치 여부에 관계없이 트리의 파일입니다 sed
. grep
여기서 동작이 이렇게 다른 이유는 무엇 sed
이며 이 명령이 작동하도록 하려면 어떻게 해야 합니까 sed
?
답변1
모든 의견 작성자가 이미 언급했듯이 sed
via 패턴 일치 또는 via 간의 반환 상태 간에는 상당한 차이가 있습니다 grep
.
반면 에 발견된 일치 항목 grep -q
만 반환하는 상태는 일치 항목이 발견되었는지 여부에 관계없이 항상 반환됩니다 (어떤 경우에는 파일이나 스트림을 읽을 수 없고 실제로 제공되지 않습니다 ). GNU 확장을 사용하면 이 반환 상태를 수정할 수 있습니다. 즉, 패턴 일치가 발생할 때만 반환 되도록 변경할 수 있습니다 .0
sed
0
0
sed
sed
1
sed -n '/pkgname.*dbus/q1'
그러나 이 find
프로그램은 이전 작업의 반환 상태 print
에만 의존합니다 . 즉, 다음을 사용하여 반환 상태를 무효화 해야 합니다.0
exec
sed
!
find
then을 사용하는 전체 명령 sed
은 다음과 같습니다.
find . -name 'PKGBUILD' ! -exec sed -n '/pkgname.*dbus/q1' {} \; -print
출력 포함
./packages/dbus-python/repos/extra-x86_64/PKGBUILD
./packages/dbus-python/trunk/PKGBUILD
./packages/dbus-glib/repos/extra-x86_64/PKGBUILD
./packages/dbus-glib/trunk/PKGBUILD
예상대로. 훌륭한 통찰력을 제공해주신 @Paul_Pedant, @steeldriver, 특히 @don_crissti에게 감사드립니다!