점이 하나만 포함된 줄을 모두 삭제합니다.

점이 하나만 포함된 줄을 모두 삭제합니다.

나는 큰 텍스트를 가지고 있습니다. 하나의 행만 있는 모든 행을 삭제하고 싶습니다 ..

입력 예:

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

관련 정보