주어진 패턴 세트에서 패턴으로 시작하지 않는 라인 제거


11

다음과 같은 데이터가 포함 된 파일이 있습니다.

report aaaaaaaa  
-  ..  
-th bbbbbbbbb  
-to ccccccccc

.. --.

질문 : 다음 문자열로 시작하지 않는 행을 제거하고 싶습니다.

report  
-th  
-to

즉, 욕망 출력이 원치 않는 모든 점과 해시를 제거하고 다음과 같이 나타납니다.

report aaaaaaaa  
-th bbbbbbbbb  
-to ccccccccc

sed/ awk/ grep/ etc 작동하는 모든 솔루션.

답변:


15

sed파일을 수정하는 데 사용 :

sed -i '/^\(report\|-t\(h\|o\)\)/!d' your_file

sed패턴과 일치하지 않는 모든 줄을 삭제 하도록 지시 합니다. 그 자체가 패턴 ^(라인의 시작) 중 어느 하나 다음에 report또는 -t어느 한 다음 h또는 o.

실제 수정은 아닙니다 sed. 임시 백업 복사본을 만들고 원본 파일을 덮어 씁니다.

당신이 원하는 경우 sed(파일이 중요한 데이터를 포함하는 경우 좋은 아이디어가 될 수 있음) 원본 파일의 백업 사본을 보관하려면 줄 -i스위치를 백업 파일을 만들 수있는 확장 :

sed -i'.bak' -e '/^\(report\|-t\(h\|o\)\)/!d' your_file

your_file라는 원본의 백업을 수정 하고 생성합니다 your_file.bak.

사이드 노트

내 의도를 오해하지 말거나 이것에 위배되지 마십시오.하지만 비슷한 정규 표현식 / 텍스트 처리 관련 질문이있는 것으로 나타났습니다. 난 당신이 학습을 시작 조언 sed, awk그리고 grep자신에 대한 생산성까지 도움 속도. 다시 말하지만, 잘못 이해하지 마십시오. 나는 도와 주어서 너무 기쁩니다. 단지 당신이 매일 사용하기 위해 이러한 도구를 선택함으로써 큰 ​​이익을 얻을 수 있다고 생각합니다.

사람들이 여기에 얼마나 도움이되는지 증명하기 위해 아래 의견에 @slm의 제안을 고려하고 언제든지이 대화방에 언제든지 문의하십시오.


1
정규식은 불필요하게 암호처럼 보입니다. 세 가지 옵션을 명시 적으로 나열한 것보다 실제로 더 많은 문자를 사용한다고 생각합니다.
nispio

1
@nispio 알고 있지만 문제의 파일이 크면 더 효율적일 수 있습니다.
Joseph R.

흥미 롭군 나는 항상 길이 또는 가독성 측면에서 정규 표현식을 측정했습니다. 나는 실행 속도에 대해 많은 생각을 한 적이 없다. 나는 그들이 빠른 것을 판단하기 위해 어떻게 평가되는지에 대해 충분히 알지 못한다고 생각하지만, 그것이 구현에 따라 다르다고 가정합니다.
nispio

3
Q & A 스타일에 맞지 않는 일반적인 질문이있는 경우 언제든지이 사이트의 대화방에서 채팅을 시도 할 수 있습니다. chat.stackexchange.com/rooms/26/unix-and-linux . 우리 중 일부는 거기에 살고 8-)
slm

@slm 감사합니다. 내 답변에 추가하겠습니다.
Joseph R.


2

사용 sed:

sed -n -e '/^report\|^-th\|^-to/p' filename

많은 비용을 절약 할 수는 없지만 -th/ -to을 결합 할 수 -t[ho]있습니다.
케빈

1
@Kevin 사실입니다. 그의 답변에 대한 주석에서 Joseph R.과의 대화를보십시오.
nispio

2

사용 awk:

awk '/^report|^-t[ho]/' file

많은 비용을 절약 할 수는 없지만 -th/ -to을 결합 할 수 -t[ho]있습니다.
케빈

1

질문자는 두 가지 점을 지적했습니다.

  • "report"또는 "-th"또는 "-to"로 시작하지 않는 행을 제거하려고합니다.
  • 원하는 출력은 "중간 원치 않는 점과 해시 (sic)"를 모두 제거해야합니다.

이 시점에서 솔루션은 첫 번째 지점과 두 번째 지점을 처리합니다. 그러나 파일이 더 크고 다음과 같다고 가정하십시오.

report aaaaaaaa  
-  ..  
-th bbbbbbbbb  
-to ccccccccc
anything else
.. --.
-tp ddd
-tq eee
     -  -----

OP의 두 번째 요점을 해결하지 않아도 될까요?

sed -r -i.bak '/^[ |.|-]*$/d' input-file 

공백, 점 및 대시 만 포함하는 아마도 원치 않는 선을 제거하고 나머지는 그대로 유지하는 작업을 수행합니다.
두 가지 방법 중 하나의 위험은 파일의 특성이 올바르게 정의되어 있지 않다고 생각합니다.


0

펄 사용하기 :

perl -ne 'print if /^report|^-t[ho]/' filename > newfile

또는, 장소에서 편집 (같은 sed, perl이것은 사실이 아니다, 그래서 또한 임시 백업을 만들 것입니다 장소에서 편집) :

perl -i.bak -ne 'print if /^report|^-t[ho]/' filename

그러면 원본 파일의 복사본이 만들어 filename.bak지고 편집 된 버전으로 원본 파일을 덮어 씁니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.