다음과 같은 데이터가 포함된 파일이 있습니다.
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
뒤에 h
or 가 옵니다 o
.
이는 실제 내부 수정이 아니라는 점에 유의해야 합니다. sed
임시 백업 복사본이 생성되고 원본 파일이 해당 복사본으로 덮어쓰여집니다.
원본 파일의 백업 복사본을 보관 하려면 sed
(파일에 중요한 데이터가 포함된 경우 좋은 방법일 수 있음) 스위치에 -i
백업 파일을 생성할 수 있는 확장명을 제공하십시오.
sed -i'.bak' -e '/^\(report\|-t\(h\|o\)\)/!d' your_file
your_file
이름이 지정된 원본 백업이 수정되어 생성됩니다 your_file.bak
.
메모
제 의도를 오해하거나 화를 내지 마십시오. 그러나 유사한 정규식/텍스트 처리 관련 질문이 많이 있는 것으로 나타났습니다. 나는 당신이 학습을 시작 하고 생산성을 높이는 데 도움이 되도록 스스로 sed
의지할 것을 제안합니다. 다시 한 번 말씀드리지만 오해하지 마세요. 제가 기꺼이 도와드리겠습니다(여기 있는 대부분의 사람들도 마찬가지입니다). 일상적인 사용을 위해 이러한 도구를 선택하면 큰 이점을 얻을 수 있다고 생각합니다.awk
grep
여기 사람들이 얼마나 도움이 되는지 증명하기 위해 아래 댓글에 있는 @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
편집된 버전으로 원본 파일을 덮어쓰게 됩니다.