정규식 일치 + 추가된 줄 제거

정규식 일치 + 추가된 줄 제거

그래서 저는 현재 "고급" 정규식이라고 부르는 것에 대해 매우 익숙하지 않습니다. 양해해 주시기 바랍니다. 여러분에게는 이것이 정말 쉬울 수도 있지만 지금 당장은 제가 올바른 방향을 제시해야 하기 때문입니다. 고군분투하는.

포럼과 웹사이트(다음 포함)를 크롤링했습니다.http://www.grymoire.com/Unix/Sed.html) 그리고 나는 내가 찾고 있던 것을 찾을 수 없었거나 적어도 그 반대를 찾을 수 없었습니다. 그래서 나는 그것을 뒤집어서 내가 원하는 표준 출력을 얻었습니다.

데이터(표준 입력)는 다음과 같습니다.

C:\Users\Maison\Documents\AutoCad_dir
True
False
0
1
User
Group
Everyone
Full Access
S-I-D

C:\Users\Maison\Documents
True
False
0
1
User
Group
Everyone
Full Access
S-I-D

내가하고 싶은 것은 정규식을 사용하고 각 줄을 삭제하는 것입니다4 목차 이상그리고 다음 10줄(CR \r 포함).

나머지는 다음과 같습니다.

C:\Users\Maison\Documents
True
False
0
1
User
Group
Everyone
Full Access
S-I-D

노트:볼륨 레이블(C:)이 일정하지 않으며 사용 중인 데이터가 절대적이지 않습니다.

물론 제가 가지고 있는 실제 데이터에는 제가 삭제하고 싶은 라인과 비슷한 라인이 더 많이 있습니다.

지금까지 내가 가진 최고는 다음과 같습니다.

 sed '/pattern/I,+11 d' infile

하지만 논리적인 패턴을 생각해낼 수는 없습니다. 지금까지 생각해낸 모든 패턴은 디렉터리 수에 관계없이 모든 행을 삭제합니다.

묻고 싶지 않지만 이것은 결국 RegEx와 GNU sed에 대해 더 잘 이해할 수 있게 해 줄 것입니다.

답변1

예:

sed '/^[A-Z]:\\\([^\\]\+\\\)\{3,\}/,+10d' test.txt

확장 정규식( -r으로 지정 sed)을 사용하는 경우 다음을 이스케이프하기만 하면 되기 때문에 표현식을 더 쉽게 읽을 수 있습니다 \.

sed -r '/^[A-Z]:\\([^\\]+\\){3,}/,+10d' test.txt

흥미로운 부분은 ([^\\]+\\){3,}괄호 안의 패턴이 를 제외한 모든 문자의 1개 이상의 인스턴스와 일치한다는 것을 의미하며 /, 그 뒤에는 /. 성냥.

답변2

사용 awk(질문이 사용 중이기 때문에상표):

$ awk -F '\\' 'NF > 4 { skip = 11 } --skip < 0 { print }' file.in
C:\Users\Maison\Documents
True
False
0
1
User
Group
Everyone
Full Access
S-I-D

이는 각 행을 \구분된 레코드로 처리합니다. 레코드의 필드 수가 4보다 크면 레코드와 다음 10줄의 입력을 건너뛰도록 설정합니다 skip = 11. 그런 다음 이 변수는 입력 줄마다 감소하고 값이 음수인 경우(건너뛰려는 줄을 건너뛴 것을 의미) 해당 줄을 인쇄합니다.

스크립트는 다음과 같이 단축될 수 있습니다.

$ awk -F '\\' 'NF > 4 { skip = 11 } --skip < 0' file.in

이 스크립트의 두 버전 모두실패하다(잘못된 출력 생성) 각 블록의 첫 번째 행 이외의 다른 행에 4 \개 이상이 포함된 경우.

관련 정보