[shell] 문자열 변수에서 고정된 prefix / suffix 잘라내기
Shell script 문자열 변수에서 종종 .txt, .png 와 같은 파일 확장자를 제거하고 싶은 경우가 있습니다. Python 이라면 split 메소드를 활용하면 될텐데, shell script 상에서는 어떻게 이를 간단하게 처리할 수 있을까요?
Shell 스크립트를 작성하다 보면, 파일 이름에서 .txt
, .png
와 같은 확장자를 제거하거나, 특정 접두사(prefix)를 제거해야 하는 상황이 종종 발생합니다. 예를 들어, readme.txt, image1.png와 같은 파일 이름들이 있을 때, 확장자를 제거하여 순수 파일 이름만 추출하거나, revised_file1.txt, revised_file2.txt와 같이 특정 패턴으로 시작하는 문자열에서 불필요한 부분(예를 들면 revised_)을 제거해야 할 때가 있습니다. 이번 글에서는 shell parameter extension을 활용하여 문자열 변수에서 고정된 prefix와 suffix를 간단히 잘라내는 방법을 알아보겠습니다.
Shell parameter extension이란?
Shell parameter extension은 쉘 스크립트에서 변수의 값을 조작하거나 부분 문자열을 추출하는 강력한 기능입니다. 이를 통해 변수의 일부를 삭제하거나, 특정 패턴을 기준으로 문자열을 자르는 등의 작업을 간단히 수행할 수 있습니다. 특히, 문자열의 prefix나 suffix를 제거할 때 매우 유용하게 사용됩니다. Shell parameter extension의 다양한 종류와 사용법에 대해 알아보시려면, 이 페이지를 참고하시면 좋습니다.
Shell parameter extension을 활용하여 고정된 prefix / suffix 잘라내기
Suffix 잘라내기 (확장자 제거): %를 이용하자
파일 이름에서 확장자를 제거하는 경우부터 생각해 봅시다. 예를 들어,file.txt
라는 문자열에서 .txt
를 제거하여 file
만 남기고 싶다면 다음과 같이 할 수 있습니다.
filename="file.txt"
name_without_extension="${filename%.*}" # .txt를 제거합니다
echo $name_without_extension # 출력: file
${filename%.*}
에 주목합시다. ${filename}
은 원래 filename 변수의 값을 나타내게 되는데, shell parameter extension의 %{pattern}
연산자는 해당 변수의 뒷 부분에 나타나는 가장 짧은 패턴을 제거합니다.
추가로, %
대신 %%
연산자를 사용하면 (${filename%%.}
) 문자열 뒤에서부터 매칭되는 가장 긴 패턴을 제거합니다. 아래 예시로 차이점을 확인해보시죠!
bashCopyfilename="archive.tar.gz"
name_without_extension="${filename%.*}"
echo $name_without_extension # 출력: archive.tar
name_without_all_extensions="${filename%%.*}"
echo $name_without_all_extensions # 출력: archive
Prefix 잘라내기: #을 이용하자
반대로, 문자열의 앞부분에 있는 고정된 prefix를 제거할 수도 있습니다. 예를 들어, image_photo.png
에서 image_
를 제거하여 photo.png
를 얻고 싶다면 다음과 같이 할 수 있습니다.
bashCopyfilename="image_photo.png"
name_without_prefix="${filename#image_}"
echo $name_without_prefix # 출력: photo.png
${filename#image_}
: 변수filename
에서 가장 짧은 패턴image_
를 제거합니다.
Suffix 때의 예시와 유사하게, ##
연산자는 앞에서부터 매칭되는 가장 긴 문자열을 제거합니다. 아래 예시로 살펴보시죠!
bashCopyfilename="backup_2023_10_01.tar.gz"
name_without_prefix="${filename#backup_}"
echo $name_without_prefix # 출력: 2023_10_01.tar.gz
3) Prefix와 Suffix 동시에 잘라내기
만약 prefix와 suffix를 동시에 제거해야 한다면, 두 가지 확장 기능을 조합하여 사용할 수 있습니다.
bashCopyfilename="prefix_file_suffix.txt"
name_without_prefix_suffix="${filename#prefix_}"
name_without_prefix_suffix="${name_without_prefix_suffix%_suffix.txt}"
echo $name_without_prefix_suffix # 출력: file
마무리
이번 글에서는 shell parameter extension을 활용하여 문자열 변수에서 고정된 prefix와 suffix를 제거하는 방법을 알아보았습니다.
정리하면${변수%패턴}
과 ${변수#패턴}
을 사용하면 파일 확장자 제거나 특정 패턴으로 시작하는 문자열을 간단히 처리할 수 있었습니다. 항상 까먹는 내용이긴 하지만... 간단한 쉘 스크립트 작업 시에 이러한 기능을 활용하면 코드를 더욱 간결하고 효율적으로 작성할 수 있어서 이번 기회에 잘 기억해두도록 하겠습니다! 😊