create
로 시작 하고 끝나는 줄을 검색하려고 합니다 ;
. 일치 항목은 여러 줄에 걸쳐 있을 수 있습니다. 사용해 보았습니다grep이를 위해 인터넷 검색을 한 후 방법을 알아냈습니다.
다음 쿼리로 이를 수행할 수 있습니다.
grep -zioE 'create (\w|\W|\n)*?;' Day1.sql | less
# Output
create schema sigmoid_db;
create table instructor(
ID char(5),
name varchar(20),
dept_name varchar(20),
salary numeric(8,2));
\n
왜 동일한 쿼리가 작동 하지 않는지 묻고 싶습니다 . 아래와 같은 쿼리는 동일한 출력을 생성해야 합니다.
grep -zioE 'create (\w|\W)*?;' Day1.sql | less
# Output
create schema sigmoid_db;
내 추론은 \w|\W
어떤 문자와도 일치해야 한다는 것입니다. 그러나 두 번째 명령은 여러 줄에 걸쳐 있는 패턴을 인쇄하지 않습니다.
왜 이런 일이 일어나는지 말해 줄 수 있는 사람이 있나요?
답변1
이 \n
기호는 캐리지 리턴 문자입니다. 이것은 한 선을 다른 선과 구분하는 특수 기호입니다.
모든 텍스트 파일은 실제로 긴 목록입니다. 예를 들면 다음과 같습니다.
first\nsecond\nthird\n
화면에 다음과 같이 인쇄
first
second
third
입력 파일을 여러 줄로 나누고 grep
한 줄씩 처리합니다. 여러 줄의 패턴을 찾으려면 \n
적절한 위치에 정규식을 사용해야 합니다.
이것이 create (\w|\W)*?;
바로 패턴이 한 줄 일치 항목만 찾는 이유입니다.
또한 제어 기호(및 그 중 하나)는 \n
"알파벳"( ) 또는 "비알파벳"( ) 그룹의 구성원으로 간주되지 않습니다. 이들은 자체 그룹에 속해 있으므로 개별적으로 사용해야 합니다.\w
\W