주어진 패턴 세트에서 패턴으로 시작하지 않는 줄을 제거합니다.

주어진 패턴 세트에서 패턴으로 시작하지 않는 줄을 제거합니다.

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

report aaaaaaaa  
-  ..  
-th bbbbbbbbb  
-to ccccccccc

.. --.

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

report  
-th  
-to

이는 원하는 출력이 불필요한 중간 지점과 해시를 모두 제거하고 다음과 같이 표시됨을 의미합니다.

report aaaaaaaa  
-th bbbbbbbbb  
-to ccccccccc

sed// awk/ grep기타 가능한 해결책.

답변1

sed파일의 내부 수정 사용 :

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

sed패턴과 일치하지 않는 모든 라인을 삭제하라는 지시입니다 . 패턴 자체는 ^(줄의 시작)이고 그 뒤에 or 가 오고 report-t뒤에 hor 가 옵니다 o.

이는 실제 내부 수정이 아니라는 점에 유의해야 합니다. sed임시 백업 복사본이 생성되고 원본 파일이 해당 복사본으로 덮어쓰여집니다.

원본 파일의 백업 복사본을 보관 하려면 sed(파일에 중요한 데이터가 포함된 경우 좋은 방법일 수 있음) 스위치에 -i백업 파일을 생성할 수 있는 확장명을 제공하십시오.

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

your_file이름이 지정된 원본 백업이 수정되어 생성됩니다 your_file.bak.

메모

제 의도를 오해하거나 화를 내지 마십시오. 그러나 유사한 정규식/텍스트 처리 관련 질문이 많이 있는 것으로 나타났습니다. 나는 당신이 학습을 시작 하고 생산성을 높이는 데 도움이 되도록 스스로 sed의지할 것을 제안합니다. 다시 한 번 말씀드리지만 오해하지 마세요. 제가 기꺼이 도와드리겠습니다(여기 있는 대부분의 사람들도 마찬가지입니다). 일상적인 사용을 위해 이러한 도구를 선택하면 큰 이점을 얻을 수 있다고 생각합니다.awkgrep

여기 사람들이 얼마나 도움이 되는지 증명하기 위해 아래 댓글에 있는 @slm의 조언을 고려하고 언제든지 들러주세요.이 채팅방자유롭게 질문하세요.

답변2

간단한 grep을 사용하여 이를 달성할 수 있습니다.

grep -E '^(report|-th|-to)' filename

아니면 더 짧게,

grep -E '^(report|-t[ho])' filename

답변3

사용 awk:

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

답변4

펄 사용:

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

또는 내부 편집(예 sed: perl임시 백업도 수행되므로 실제로는 그렇지 않습니다)제자리에편집하다):

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

이렇게 하면 원본 파일의 복사본이 생성되고 filename.bak편집된 버전으로 원본 파일을 덮어쓰게 됩니다.

관련 정보