find 명령 패턴 일치에서 sed와 grep 사용법의 차이점

find 명령 패턴 일치에서 sed와 grep 사용법의 차이점

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해당 파일에만 올바른 패턴이 포함되어 있으므로 상대 파일 경로로 출력됩니다 . 내가 이해한 바에 따르면, -qgrep의 옵션은 일치하는 항목이 없는 한 인쇄를 무시합니다.

하지만 를 사용하여 동일한 동작을 시뮬레이션할 수 있어야 합니다 sed. 저는 다음과 같이 사용합니다

find . -name 'PKGBUILD' -exec sed -n '/pkgname.*dbus/q' {} \; -print

where 는 출력을 생략하고 일치하는 항목이 발견되면 즉시 종료하는 -n데 사용됩니다 . q그러나 명령은 다음을 출력합니다.모든 PKGBUILD일치 여부에 관계없이 트리의 파일입니다 sed. grep여기서 동작이 이렇게 다른 이유는 무엇 sed이며 이 명령이 작동하도록 하려면 어떻게 해야 합니까 sed?

답변1

모든 의견 작성자가 이미 언급했듯이 sedvia 패턴 일치 또는 via 간의 반환 상태 간에는 상당한 차이가 있습니다 grep.

반면 에 발견된 일치 항목 grep -q만 반환하는 상태는 일치 항목이 발견되었는지 여부에 관계없이 항상 반환됩니다 (어떤 경우에는 파일이나 스트림을 읽을 수 없고 실제로 제공되지 않습니다 ). GNU 확장을 사용하면 이 반환 상태를 수정할 수 있습니다. 즉, 패턴 일치가 발생할 때만 반환 되도록 변경할 수 있습니다 .0sed00sedsed1

sed -n '/pkgname.*dbus/q1'

그러나 이 find프로그램은 이전 작업의 반환 상태 print에만 의존합니다 . 즉, 다음을 사용하여 반환 상태를 무효화 해야 합니다.0execsed!

findthen을 사용하는 전체 명령 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에게 감사드립니다!

관련 정보