myVar
bash에는 다음과 같은 긴 문자열을 포함하는 변수가 있습니다 .
-rw-rw-rw- root/root 16 2018-02-12 10:03 foo_tar/baz1234_
myVar
마지막 슬래시 이전의 모든 것을 제거하고 싶습니다(마지막 슬래시 포함), myVar
결국에는 저장됩니다 baz1234_
. 모든 것을 삭제하고 결과를 변수에 저장하려면 어떻게 해야 합니까?
나는 sed를 다루는 솔루션을 발견했지만 그 솔루션은 파일 처리를 다루기 때문에 그것이 내 문제입니다.
답변1
당신은 사용해야합니다bash
매개변수 확장이를 위해 유형의 하위 문자열 제거를 사용하십시오.${PARAMETER##PATTERN}
처음부터 -
${PARAMETER##PATTERN}
이 형식은 일치를 시도하는 문자열의 시작 부분에서 설명된 패턴을 제거합니다. 그들은
##
가장 긴 텍스트 일치를 사용하여 이를 수행하려고 합니다.
당신의 예를 들어
$ myVar='-rw-rw-rw- root/root 16 2018-02-12 10:03 foo_tar/baz1234_'
$ echo "${myVar##*/}"
baz1234_
주석에서 지적했듯이 문제의 문자열은 ls
변수에 있는 명령의 출력인 것으로 보입니다! 이는 스크립트를 작성하는 이상적인 방법이 아닙니다. 요구 사항을 더 명확하게 설명하십시오.
답변2
이상한 해결책 :
myVar='-rw-rw-rw- root/root 16 2018-02-12 10:03 foo_tar/baz1234_'
myVar=$(echo "$myVar" | awk -F '/' '{print $NF}')
그러나 다른 사람들이 지적했듯이 ls의 출력을 변수로 저장하는 것은 좋은 생각이 아닙니다. 스크립트에 더 많은 컨텍스트를 제공할 수 있다면 더 나은 솔루션을 제안할 수 있을 것입니다.
답변3
댓글에서:
각각 여러 파일이 포함된 tar 아카이브로 가득 찬 폴더가 있습니다. baz로 시작하고 숫자가 뒤따르고 마지막으로 밑줄 _이 오는 특정 파일을 얻기 위해 반복합니다.
그러면 이것이 나열된 출력입니까 tar tzvf foo.tar.gz
, 아니면 이와 유사한 것입니까? 나는 (세부 사항 없이) 을 사용하여 파일 이름을 출력할 뿐이 tar
므로 쉘을 사용하여 출력을 한 줄씩 처리하는 대신 다음과 같은 작업을 수행하여 파일 이름을 얻을 수 있습니다.tar t ...
v
tar tzf foo.tar.gz |grep -E '/baz[0-9]+_$' |sed -e 's,.*/,,'
(또는 명령 대체를 통해 캡처합니다. filename=$(tar ... | sed ...)
물론 sed
매개변수 확장으로 대체 할 수도 있습니다 ${filename##./}
.)