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

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

report aaaaaaaa
-  ..
-th bbbbbbbbb
-to ccccccccc

.. --.

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

report
-th
-to

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

report aaaaaaaa
-th bbbbbbbbb
-to ccccccccc

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



답변

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의 제안을 고려하고 언제든지이 대화방에 언제든지 문의하십시오.


답변

간단한 grep을 사용할 수 있습니다.

$ grep -e '^report\|^-th\|^-to' filename


답변

사용 sed:

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


답변

사용 awk:

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


답변

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

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

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

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

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

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

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


답변

펄 사용하기 :

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

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

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

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


답변