이 grep에 '\n'을 써야 합니까?

이 grep에 '\n'을 써야 합니까?

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

관련 정보