다음과 같은 데이터가 포함 된 파일이 있습니다.
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
지고 편집 된 버전으로 원본 파일을 덮어 씁니다.