.txt
파일을 읽고 결과를 어딘가에 저장하는 스크립트를 작성 중입니다 .
표현을 줄여야 합니다.
str1/str2/str3/str4/str5
난 그저 필요해str5
위에 있는 내용입니다.
루프에서 한 줄씩 파일을 읽고 있습니다 while
.
그러한 문자열을 줄이는 방법은 무엇입니까?
답변1
이 basename
유틸리티는 경로 이름의 파일 이름 부분을 반환합니다. 문자열을 경로 이름으로 처리하면 다음이 반환됩니다 str5
.
string=str1/str2/str3/str4/str5
basename -- "$string"
위의 출력은 str5
. 이는 $string
개행 문자가 포함되어 있거나 다음으로 시작하는 경우에도 작동합니다 -
.
string='-str1/str2/str3/str
4/str5'
basename -- "$string"
결과를 basename
변수에 저장하는 것은 일반적인 명령 대체를 통해 수행됩니다.
newstring=$( basename -- "$string" )
하지만명령 대체줄자모두후행 개행 문자: 줄 구분 기호로 출력되는 문자이지만 basename
끝에 있는 개행 문자도 포함됩니다 $string
.
이는 POSIX 셸의 연산자를 사용하여 피할 수 있습니다 ${var##pattern}
(또한 프로세스를 포크하고 별도의 명령을 실행하는 것을 절약할 수 있음).
string='very/
strange
file name
'
newstring=${string##*/}
그러나 s에 대해 또는와 $string
같은 다른 값을 제공합니다./
/some/dir/
답변2
이것이 당신에게 효과가 있습니까?
string="str1/str2/str3/str4/str5"
echo $string | awk -F'/' '{print $5}'
-F는 구분 기호를 지정하는 데 사용됩니다.
답변3
while 루프에서 파일을 읽을 때 다음을 수행할 수 있습니다.
while IFS='/' read -r one two three four five junk; do
echo "$five"
done < yourfile
또는 다음을 사용할 수 있습니다 cut
.
cut -d'/' -f5 yourfile
답변4
간단한 대체를 사용할 수 있습니다.
echo ${string##*/}
예를 들어
string="str1/str2/str3/str4/str5"
echo ${string##*/}
출력을 제공합니다 str5
. 문자열에 개행 문자가 있는 경우에도 작동합니다.
/
가변 크기 문자열이 있는 경우에도 작동합니다. 즉, 문자열에 얼마나 많은 문자열이 포함되어 있는지 알 수 없습니다 .