답변:
예제가 유용했을 수도 있지만, 올바르게 이해하면 다음과 같이 작동합니다.
echo "Hello: world" | cut -f1 -d":"
"hello : world"를 "hello"로 변환합니다.
basename
and과 같은 도구를 실행하는 서브 쉘을 생성하는 것보다 Bash의 내장 매개 변수 확장 기능을 사용하는 것이 좋습니다. cut
아래 Dennis의 답변 참조
cut
stdin에서 읽을 수 있으므로 파일 내용과 같이 처리 해야하는 매우 긴 문자열이있을 때 특히 좋습니다.
hello: world
? 반 답변입니다.
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
hello:world
이 hello:wo
된 후 2 문자를 어떻게 삭제할 수 ${a%:*}
있습니까?
"${a##*:}"
만 얻기를 위해 tomorrow
=)
a='hello:world:of:tomorrow'; pattern=''^([^:]*:).*$'
; [[$ a = ~ $ pattern]]; 에코 "$ {BASH_REMATCH [1]}"`. 콜론이있는 경우에만 일치합니다. 이 옵션을 선택하려면 다른 패턴을 사용해야합니다. Bash 정규식 (일반적으로 정규식)에 대한 설명은이 설명의 범위를 벗어납니다. 이에 대해 논의하거나 직접 게시하는 다른 질문을 찾을 수 있습니다.
이 형식의 파일 경로가 있다고 가정 해 봅시다.
/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
다른 경우에는 마지막 경우도 도움이 될 수 있습니다. 마지막 출력의 시작 부분에 "/"가 없다는 점에 유의하십시오.
cut
작동하지만 I Dennis의 대답은 더 좋고 유연합니다. 누구든지 새로운 프로세스가 생성되는지 알고cut
있습니까?