나는 큰 텍스트를 가지고 있습니다. 하나의 행만 있는 모든 행을 삭제하고 싶습니다 .
.
입력 예:
abc.google.org
yahoo.com
abc.yahoo.in
abcd.bing.com
abcd.xyz.bing.uk
abcd.xyz.mnp.bing.uk
stackexchange.com
yas.sxs.sxs.zs.sxstackexchange.com
예상 출력:
abc.google.org
abc.yahoo.in
abcd.bing.com
abcd.xyz.bing.uk
abcd.xyz.mnp.bing.uk
yas.sxs.sxs.zs.sxstackexchange.com
당신이 제공할 수 있는 어떤 도움이라도 정말 감사하겠습니다.
답변1
awk -F'.' 'NF!=2' infile
두 개의 필드만 포함된 경우(즉, 한 지점만 발견된 라인) 이러한 라인은 인쇄되지 않습니다. 옵션을 사용하여 -F
필드 구분 기호를 지정할 수 있습니다 .
또는 gsub() 함수를 사용하십시오:
awk 'gsub(/\./, ".")!=1' infile
점 문자가 두 번 이상 성공적으로 바뀌었다면 인쇄하십시오.
답변2
그것은 마치
grep -v '^[^.]*\.[^.]*$' input.txt
이 작업을 수행하는 모든 줄을 인쇄합니다.아니요한 줄에서 단일 마침표를 찾는 RE와 일치합니다.
답변3
@shawn의 grep과 동일한 정규식을 사용하는 sed 솔루션은 다음과 같습니다.
sed -i.bak '/^[^.]*\.[^.]*$/d' FILE
FILE을 직접 처리하는 (모호한) 이점이 있습니다(그러나 원본 내용으로 FILE.bak를 작성합니다). 앵커 포인트 ^ 및 $로 인해 정규식은 전체 줄을 차지합니다. 행이 0개 이상의 점이 아닌 문자열 [^.]*
, 그 뒤에 점, 0개 이상의 점이 아닌 문자열로 구성된 경우 [^.]*
삭제됩니다.
샘플 입력으로 테스트합니다.
답변4
POSIX sed:
- 다음에는 점이 두 개 이상 있는 줄이 인쇄됩니다.
- 남은 것은 점이 하나 있거나 없는 직선뿐입니다. 그 중 점을 삭제하세요.
sed -e '/\..*\./b' -e '/\./d' file
GNU awk:
- 점을 제외한 모든 것을 제거하고 결과 문자열의 길이를 기록하고 하나와 비교하십시오.
awk 'length(gensub(/[^.]/,"","g",t=$0))-1' file
GNU sed:
- 나중에 사용할 수 있도록 예약된 공간에 스레드를 저장합니다.
- 포인트를 삭제해 보세요.
- 실패하면 해당 줄을 인쇄하고 계속 읽으십시오.
- 남은 포인트가 없는 경우 => 원래 포인트에는 포인트가 하나만 있습니다. 그러니 삭제하세요.
- 그렇지 않으면 포인트가 1보다 크므로 원래 행을 검색합니다.
sed -e 'h;s/\.//;T;//!d;g' file
진주:
- 점 음역 개수가 1개인 경우 목록 구분 기호($,)를 지정하며 기본값은 빈 문자열입니다.
- -p 옵션은 현재 레코드를 자동으로 인쇄합니다.
perl -pe 'y|.||-1||($_=$,)' file
파이썬:
- if 절과 함께 목록 이해는 두 개 이상의 필드로 분할되거나 필드가 없는 행을 선택합니다.
python3 <<\eof
with open('file') as f:
print(*[l for l in f if len(l.split('.')) != 2],sep='',end='')
eof
여러 개의 -e 문이 ORing을 의미하는 표준 grep
$ grep -e '\..*\.' -e '^[^.]*$' file