먼저 다음 코드를 시도합니다.
find . -name "*.cfg" | xargs grep "good"|grep -v "^\#"
현재 폴더에서 확장자가 "cfg"인 파일 이름 목록을 얻습니다. 그런 다음 "good"이 포함되어 있지만 "#"으로 시작하지 않는 줄의 콘텐츠를 검색하고 싶습니다. 하지만 내 코드가 작동하지 않습니다. 뭐가 문제 야? 감사해요.
답변1
사용할 쓸모 없는 xargs(검색 결과에 -exec가 있는 경우):
find . -name "*.cfg" -exec egrep "^[^#]*good" {} +
캐럿은 마스크될 필요가 없습니다. 어떤 상황에서 마스크되어야 하는지 모르겠습니다. 하지만 거기에는 아무런 해가 없습니다. 당신의 모든 명령이 나에게 효과적입니다.
답변2
다음과 같이 작동해야 합니다.
find . -name "*.cfg" -print0 | xargs -0 grep -E '^([^#].*|)good'
공백이 포함된 파일 이름 문제를 피하기 위해 전환했습니다 -print0
.
그런 다음 단일 정규식을 포함 good
하지만 시작하지 않는 행을 필터링합니다 . #
왼쪽 대체( [^#].*
)는 문자가 아닌 으로 시작하는 행과 일치하고 #
, 오른쪽 대체(비어 있음)는 로 시작하는 행과 일치하도록 허용합니다 good
.
귀하의 질문에 두 개가 아닌 단일 정규식을 사용하면 GNU grep이 파일 이름을 인쇄하도록 할 수 있습니다(여러 파일이 제공되는 경우 이 작업을 수행합니다 find
). 두 번째 단계를 추가하면 grep -v ^...
파일 줄의 시작 부분과 일치하지 않습니다.