문자열 단축

문자열 단축

.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. 문자열에 개행 문자가 있는 경우에도 작동합니다.

/가변 크기 문자열이 있는 경우에도 작동합니다. 즉, 문자열에 얼마나 많은 문자열이 포함되어 있는지 알 수 없습니다 .

관련 정보