bash에서 문자 다음에 모든 텍스트를 제거하려면 어떻게합니까?


147

bash에서 문자 뒤의 콜론 ( ":") 뒤의 모든 텍스트를 어떻게 제거 할 수 있습니까? 콜론도 제거 할 수 있습니까? 나는 방법을 모른다.

답변:


134

예제가 유용했을 수도 있지만, 올바르게 이해하면 다음과 같이 작동합니다.

echo "Hello: world" | cut -f1 -d":"

"hello : world"를 "hello"로 변환합니다.


5
cut작동하지만 I Dennis의 대답은 더 좋고 유연합니다. 누구든지 새로운 프로세스가 생성되는지 알고 cut있습니까?
JoBu1324

3
basenameand과 같은 도구를 실행하는 서브 쉘을 생성하는 것보다 Bash의 내장 매개 변수 확장 기능을 사용하는 것이 좋습니다. cut아래 Dennis의 답변 참조
Louis Maddox

1
cutstdin에서 읽을 수 있으므로 파일 내용과 같이 처리 해야하는 매우 긴 문자열이있을 때 특히 좋습니다.
하스

1
그리고 이것이 어떻게 적용됩니까 hello: world? 반 답변입니다.
K-SO의 독성이 증가하고 있습니다.

{var / : / ''}와 같은 대체 구문을 사용하여 수행 할 수 있지만 bash에서만 작동합니다.
Mahesh

264

Bash (및 ksh, zsh, dash 등) %에서 문자열의 끝에서 #문자를 제거 하거나 문자열 의 시작에서 문자를 제거 하는 매개 변수 확장을 사용할 수 있습니다 . 해당 문자 중 하나를 사용하면 일치하는 가장 작은 문자열이 제거됩니다. 문자를 두 배로 늘리면 가장 긴 문자가 제거됩니다.

$ a='hello:world'
$ b=${a%:*}
$ echo "$b"
hello
$ a='hello:world:of:tomorrow'
$ echo "${a%:*}"
hello:world:of
$ echo "${a%%:*}"
hello
$ echo "${a#*:}"
world:of:tomorrow
$ echo "${a##*:}"
tomorrow

6
이것은 기본 셸 문자열 조작이므로 추가 프로세스가 생성되지 않습니다. 참조 Bash 매개 변수 대체 , Bash 문자열 조작더 나은 Bash 스크립팅
Dodzi Dzakuma

@denniswilliamson 다음과 같이 특정 문자열 hello:worldhello:wo된 후 2 문자를 어떻게 삭제할 수 ${a%:*}있습니까?
3kstc

멋진 대답, 감사를 많이하지만, 좋은도 추가 할 수있을 것입니다 "${a##*:}"만 얻기를 위해 tomorrow=)
avtomaton

1
@openCivilisation : 다음 정규식 일치를 사용해야 할 수도 있습니다. a='hello:world:of:tomorrow'; pattern=''^([^:]*:).*$'; [[$ a = ~ $ pattern]]; 에코 "$ {BASH_REMATCH [1]}"`. 콜론이있는 경우에만 일치합니다. 이 옵션을 선택하려면 다른 패턴을 사용해야합니다. Bash 정규식 (일반적으로 정규식)에 대한 설명은이 설명의 범위를 벗어납니다. 이에 대해 논의하거나 직접 게시하는 다른 질문을 찾을 수 있습니다.
추후 공지가있을 때까지 일시 중지되었습니다.

1
@ kp123 : 내 대답의 첫 번째 예입니다. 두 번째로 보여줄 때 ( "내일"이 제거 된 경우), 거의 정확히 당신이 요구하는 상황입니다.
추후 공지가있을 때까지 일시 중지되었습니다.


4
egrep -o '^[^:]*:'

이것을 해석하는 방법을 설명해 주시겠습니까, 감사합니다.
rɑːdʒɑ

1
egrep와 grep입니다 -E. 여기서는 정규와 차이가 없습니다 grep. -ogrep에게 표현식과 일치하는 행 부분 만 인쇄하도록 지시합니다. ^일치하는 줄의 시작 부분에 고정합니다. [^:]*문자가 아닌 0 개 이상의 문자와 일치합니다 :. :문자와 일치합니다 :.
cdhowie

다시 설명을 주셔서 감사합니다
rɑːdʒɑ

3

이 형식의 파일 경로가 있다고 가정 해 봅시다.

/dirA/dirB/dirC/filename.file

이제 네 개의 "/"를 포함하는 경로 만 원합니다. 유형

$ echo "/dirA/dirB/dirC/filename.file" | cut -f1-4 -d"/"

그리고 당신의 출력은

/dirA/dirB/dirC

cut을 사용하면 파일뿐만 아니라 uppest 디렉토리도 잘라낼 수 있다는 장점이 있습니다.

$ echo "/dirA/dirB/dirC/filename.file" | cut -f1-3 -d"/"

당신의 출력은

/dirA/dirB

문자열의 다른 쪽에서도 똑같이 할 수 있지만이 경우에는 입력하는 것이별로 의미가 없습니다.

$ echo "/dirA/dirB/dirC/filename.file" | cut -f2-4 -d"/"

결과

dirA/dirB/dirC

다른 경우에는 마지막 경우도 도움이 될 수 있습니다. 마지막 출력의 시작 부분에 "/"가 없다는 점에 유의하십시오.


2
"/resources/views/admin/users/relationships/posts.blade.php"디렉토리가 있고 "/"의 수를 모르는 경우 "/"가 마지막으로 발생한 후 모든 항목을 잘라내려면 어떻게해야합니까? "문자는 문자열에 있습니다. 따라서 여기서 출력이 "/ resources / views / admin / users / relationships /"(또는 슬래시없이 / resources / views / admin / users / relationships)가되기를 원합니다. 어떻게 하시겠습니까?
kp123

-1

":"의 마지막 인스턴스 이후에 모든 것을 다듬습니다.

cat fileListingPathsAndFiles.txt | grep -o '^.*:'

마지막 ":"을 삭제하려면

cat file.txt | grep -o '^.*:' | sed 's/:$//'

@ kp123 : 교체 할 것 :으로 /합니다 (나오지도 콜론이 있어야 할 곳에 \/)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.