정규식을 사용하여 여러 파일을 검색하고 새 파일의 줄과 일치하는 콘텐츠를 출력하려면 어떻게 해야 합니까?

정규식을 사용하여 여러 파일을 검색하고 새 파일의 줄과 일치하는 콘텐츠를 출력하려면 어떻게 해야 합니까?

1000개의 소스 파일이 있고 정규식과 일치하는 모든 텍스트를 찾은 다음 각 일치 항목을 결과 텍스트 파일의 해당 줄에 출력하려고 합니다.

예를 들어;

// a.cs
string test = _.Text("Hello World!") + _.Text("Foo");
// b.cs
Debug.Log(_.ActionText("Bar"));

// results.txt
_.Text("Hello World")
_.Text("Foo")
_.ActionText("Bar")

어떤 명령이 이것을 달성합니까? 예를 들어주실 수 있나요?

답변1

sed '/\n/P;//!s/_\.[^ ("]*Text([^)]*)/\n&\n/;D' files... >results.txt

...작동할 수도 있습니다. 이를 실행하면 샘플 데이터가 인쇄됩니다.

_.Text("Hello World!")
_.Text("Foo")
_.ActionText("Bar")

그것이 하는 일은 줄의 첫 번째 항목을 \n줄줄이로 묶는 것뿐입니다. 성공 여부에 관계없이 패턴 공간의 첫 번째 줄을 D제거합니다 \n. 일치하지 않는 줄의 경우 출력에서 ​​완전히 제거되지만 일치하는 줄의 경우 패턴의 헤드만 제거되고 스크립트는 맨 위에서 다시 시작됩니다. ewline이 패턴 공간에서 일치하는 경우 \n(일치 항목을 방금 찾아서 제거한 경우에만 발생함) D패턴 공간(일치된 문자열의 끝 부분)에서 처음으로 나타나는 ewline 만 sed인쇄됩니다 . \newline이 패턴 공간에 이미 존재하는 경우 s///대체가 시도되지 않으므로 elete 명령은 인쇄된 일치 항목을 지우고 마지막 일치 항목이 끝날 때 루프가 다시 시작됩니다.!\nD

그러나 상황에 따라 올바른 대체 필드 대신 sed리터럴 ewline을 사용해야 할 수도 있습니다 . 하지만 모든 파일 매개변수를 한 번에 실행하거나 최소한 많은 매개변수를 한 번에 실행할 수 있어야 합니다.\nn(ARGMAX 한도에 따라 다름). Shell glob을 사용하여 이를 얻을 수 있습니다. 아니면...

find /path -name pattern -exec sed script_above {} + >>results.txt

... sed모든 입력 파일이 단일 스트림으로 처리되기 때문입니다.

답변2

그렙을 사용할 수 있습니다.

grep -Eo '_\.\w+\("[^"]+"\)'

관련 정보