텍스트 파일에 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
그러나 이러한 사양은 비시각적 텍스트 편집(대화식이든 자동화든)에서 정말 놀라운 성능과 유연성을 허용합니다.
위 명령은 여러 부분으로 구성됩니다.
-s
ex
대량 사용을 준비하려면 자동 모드를 활성화하세요 . (출력 메시지 억제 등)
-c
file.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