
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
인쇄됩니다 . \n
ewline이 패턴 공간에 이미 존재하는 경우 s///
대체가 시도되지 않으므로 elete 명령은 인쇄된 일치 항목을 지우고 마지막 일치 항목이 끝날 때 루프가 다시 시작됩니다.!
\n
D
그러나 상황에 따라 올바른 대체 필드 대신 sed
리터럴 ewline을 사용해야 할 수도 있습니다 . 하지만 모든 파일 매개변수를 한 번에 실행하거나 최소한 많은 매개변수를 한 번에 실행할 수 있어야 합니다.\n
n
(ARGMAX 한도에 따라 다름). Shell glob을 사용하여 이를 얻을 수 있습니다. 아니면...
find /path -name pattern -exec sed script_above {} + >>results.txt
... sed
모든 입력 파일이 단일 스트림으로 처리되기 때문입니다.
답변2
그렙을 사용할 수 있습니다.
grep -Eo '_\.\w+\("[^"]+"\)'