디렉토리의 특정 파일명에서 특정 값을 추출해야 하는데 추출된 값을 변수에 보관하는 명령을 갖고 싶습니다. 내 파일의 형식이 다음 과 같고 place.type-date.log
이를 추출하여 라는 변수에 저장하려고 한다고 가정합니다 first
. 어떻게 해야 합니까?
나는 사용하려고
first=$($file | awk -F'[.-]' '{print $1}')
그러나 성공하지 못했습니다.
보통 내가 하면
echo " place.type-date.log" | awk -F'[.-]' '{print $1}'
결과는 가 됩니다 . for 루프를 사용하여 특정 디렉터리의 여러 파일에 대해 이 작업을 수행해야 하기 때문에 명령을 로 place
바꿨습니다 .place.type-date.log
$file
place
추출된 값을 변수에 저장하고 싶기 first
때문에 extract 명령을 변수와 동일시했습니다 first
. 따라서 스크립트를 실행하려고 하면 echo first
아무 것도 표시되지 않습니다. 이는 추출된 값이 아직 변수에 저장되지 않았음을 의미합니다.
답변1
place.type-date.log
이와 같은 변수에 파일 이름이 있고 이라는 file
다른 변수의 첫 번째 점 앞에 파일 이름 부분을 저장하려고 한다고 가정합니다 first
. 이 경우 표준 매개변수 대체를 사용하여 이를 수행할 수 있습니다.
first=${file%%.*}
위의 내용은 .*
값에서 쉘 패턴과 일치하는 가장 긴 접미사를 제거하고 $file
결과를 first
.
%
대신에 를 사용하면 %%
가장 짧은 일치 접미사가 제거되고 대신에 or 를 place.type-date
사용하면 접미사 문자열은 제거되지만 접미사 문자열은 제거되지 않습니다.#
##
%
%%
이러한 대체를 사용하는 또 다른 예는 다음을 참조하세요.내 대답도착하다이전 질문.
$file
귀하의 코드는 명령이 아니라 문자열이기 때문에 작동하지 않습니다 place.type-date.log
. 당신은 다음과 같은 일을 시도했을 수도 있습니다
first=$( echo "$file" | awk -F '[.-]' '{ print $1 }' )
그러나 이것은 필요한 것보다 더 복잡합니다. 또한 파일 이름( echo
확장 가능) 의 이스케이프 시퀀스 와 개행 문자가 포함된 파일 이름( awk
줄 기반 텍스트 처리 도구)에 몇 가지 문제가 있습니다.