파일에서 특정 패턴이나 문자열 뒤에 각 줄의 나머지를 삭제하는 방법은 무엇입니까?


21

텍스트 파일에 URL 목록이 있다고 가정하십시오.

google.com/funny
unix.stackexchange.com/questions
isuckatunix.com/ireallydo

'.com'다음에 오는 모든 것을 삭제하고 싶습니다.

예상 결과 :

google.com
unix.stackexchange.com
isuckatunix.com

나는 시도했다

sed 's/.com*//' file.txt 

그러나 그것은 또한 삭제 .com되었습니다.


.com첫 번째 /문자 다음을 포함하여 모든 문자 를 제거하는 대신 검색하려는 특정 이유가 있습니까? en.wikipedia.org/wiki/Ubuntu목록에 URL이 있으면 어떻게해야 합니까?
바이트 사령관

답변:


17

".com"뒤에 오는 모든 것을 명시 적으로 삭제하려면 기존 sed 솔루션을 조정하여 ".com (anything)"을 ".com"으로 바꾸십시오.

sed 's/\.com.*/.com/' file.txt

나는 첫 번째 기간을 피하기 위해 정규 표현식을 조정했습니다. 그렇지 않으면 "thisiscommon.com/something"과 일치했을 것입니다.

"sub.com.domain.com/foo"와 같은 것을 실수로 자르지 않도록 슬래시 (/)를 사용하여 ".com"패턴을 추가로 고정 할 수 있습니다.

sed 's/\.com\/.*/.com/' file.txt

9

다음과 같은 방식으로 awk필드 구분 기호 ( -F)를 사용할 수 있습니다 .

$ cat file
google.com/funny
unix.stackexchange.com/questions
isuckatunix.com/ireallydo

$ cat file | awk -F '\\.com' '{print $1".com"}'
google.com
unix.stackexchange.com
isuckatunix.com

설명:

NAME
       awk - pattern scanning and processing language

-F fs
       --field-separator fs
              Use fs for the input field separator (the value of the FS predefined variable).

당신이 후 모든 일을 삭제할으로 .com, -F '.com'와 라인을 분리 .com하고 print $1출력을 이전 부분 만 제공합니다 .com. 따라서 예상 출력을 $1".com"추가 .com하고 제공합니다.


/FS처럼 첫 번째 분야를 취하지 않습니까?
heemayl


1
@Pandya : 다음과 같은 문자열로 실패acomercial.com/asdsad
cuonglm

@cuonglm 지적 해 주셔서 감사합니다. 개선 된 답변
Pandya

4

비 대화식 내부 파일 편집을위한 최상의 도구는 ex입니다.

ex -sc '%s/\(\.com\).*/\1/ | x' file.txt

사용 vi하고 콜론으로 시작하는 명령을 입력 한 :경우 ex 명령을 사용했습니다. 물론이 방법으로 실행할 수있는보다 고급 또는 "팬시"명령은 Vim 확장 (예 :) :bufdo이며 POSIX 사양에ex 정의되어 있지 않지만 이러한 사양을 통해 비 시각적 수준의 놀라운 성능과 유연성을 얻을 수 있습니다. 텍스트 편집 (대화식 또는 자동).

위의 명령에는 여러 부분이 있습니다.

-s자동 모드가 ex배치 사용 을 준비 할 수 있도록 합니다. (억제 출력 메시지 등)

-c파일 ( file.txt이 경우)이 버퍼에서 열리면 실행할 명령을 지정합니다 .

%1,$- 와 동등한 주소 지정자 입니다. 다음 명령이 버퍼의 모든 행에 적용됨을 의미합니다.

s이미 익숙한 대체 명령입니다. 고급 정규식 기능 중 일부는 구현에 따라 달라질 수 있지만 vis명령sed 은 일반적으로 사용되며 의 명령 과 본질적으로 동일한 기능을 갖습니다 . 이 경우 ".com"에서 줄 끝까지는 ".com"으로 바뀝니다.

수직 막대는 실행될 순차적 명령을 분리합니다. 많은 (대부분의) ex구현에서 다음 -c과 같은 추가 옵션을 사용할 수도 있습니다 .

ex -sc '%s/\(\.com\).*/\1/' -c x file.txt

그러나 이것은 POSIX에 필요하지 않습니다.

x명령이 종료, 파일에 변경 사항을 작성 후. wq"쓰기 및 종료"를 의미하는 것과 달리 x버퍼가 편집 된 경우에만 파일에 씁니다. 따라서 파일이 변경되지 않으면 타임 스탬프가 유지됩니다.



1
제자리에서 편집하지 않습니다. 적어도 그것은 Gnu sed의 가짜 -i 보다 더 크지 않습니다. 온 디스크 버퍼를 읽거나 씁니다. 자신 ex -rpreserve명령을 참조하십시오 .
mikeserv

@mikeserv preserve명령이 무엇입니까 ?
Mateen Ulhaq

2

매우 빠르고 간단하고 더러운 파이썬 방법 :

#!/usr/bin/env python
import sys
with open( sys.argv[1]  ) as file:
    for line in file:
        print line.split("/")[0]

샘플 런

skolodya@ubuntu:$ chmod +x removeStrings.py                                   

skolodya@ubuntu:$ ./removeStrings.py strings.txt                              
google.com
unix.stackexchange.com
isuckatunix.com


skolodya@ubuntu:$ cat strings.txt                                             
google.com/funny
unix.stackexchange.com/questions
isuckatunix.com/ireallydo

2
downvote의 이유를 알려 주시겠습니까?
Sergiy Kolodyazhnyy

3
작동하지만 신경 쓰지 않아도 .com됩니다. 첫 번째 /줄 부터 시작하여 모든 것을 제거합니다 . (제 생각에는 더 나은 접근 방식입니다!)
Byte Commander

1
@ByteCommander 정확히 맞아! domain name이 .net다른 접근 방식에서는 domain 및 extension 뒤에 오는 부분이 삭제되지 않으므로 /구분 기호 로 사용하는 것이 더 안전합니다 .
Sergiy Kolodyazhnyy

내가 AskUbuntu.com에있는 것처럼 느끼게하는 답변과 댓글에 대한 +1 : D
WinEunuuchs2Unix
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.