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

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

텍스트 파일에 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삭제됐다.

답변1

".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

답변2

당신은 그것을 사용할 수 있습니다awk필드 구분 기호( -F)는 다음과 같습니다.

$ cat file
google.com/funny
unix.stackexchange.com/questions
isuckatunix.com/ireallydo
$ <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하고 예상되는 결과를 제공하십시오.

답변3

비대화형 내부 파일 편집을 위한 가장 좋은 도구는 입니다 ex.

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

vi콜론으로 시작하는 명령을 사용하고 입력한 적이 있다면 :ex 명령을 사용한 것입니다. 물론 이런 방식으로 수행할 수 있는 고급 명령이나 "멋진" 명령 중 다수는 Vim 확장(예: :bufdo)이며 Vim에서는 사용할 수 없습니다.POSIX 사양ex그러나 이러한 사양은 비시각적 텍스트 편집(대화식이든 자동화든)에서 정말 놀라운 성능과 유연성을 허용합니다.

위 명령은 여러 부분으로 구성됩니다.

-sex대량 사용을 준비하려면 자동 모드를 활성화하세요 . (출력 메시지 억제 등)

-cfile.txt버퍼에서 파일(이 경우)을 연 후 실행할 명령을 지정합니다.

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

s이미 익숙할 수도 있는 대체 명령입니다. 일반적으로 사용되며 vi동일한 내용을 가지고 있습니다.s명령sed, 일부 고급 정규식 기능은 구현마다 다를 수 있습니다. 이 경우 ".com"부터 줄 끝까지 ".com"만 교체됩니다.

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

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

그러나 POSIX에서는 이를 요구하지 않습니다.

x파일에 변경 사항이 기록되면 명령이 종료됩니다. wq"쓰기 및 종료" 와 달리 x파일은 버퍼가 편집된 경우에만 기록됩니다. 따라서 파일이 변경되지 않은 경우 타임스탬프가 보존됩니다.

답변4

  • 문자열 뒤의 모든 항목 삭제
    sed 's/\.com.*/.com/'
    
    예:
    sed 's/\.com.*/.com/' filename >> filename
    
  • 단어 앞의 모든 항목 삭제
    sed 's/^.*can/can/' filename >> filename
    

관련 정보