[shell] 문자열 변수에서 고정된 prefix / suffix 잘라내기

Shell script 문자열 변수에서 종종 .txt, .png 와 같은 파일 확장자를 제거하고 싶은 경우가 있습니다. Python 이라면 split 메소드를 활용하면 될텐데, shell script 상에서는 어떻게 이를 간단하게 처리할 수 있을까요?

[shell] 문자열 변수에서 고정된 prefix / suffix 잘라내기
Photo by Miles Burke / Unsplash

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를 제거하는 방법을 알아보았습니다.

정리하면${변수%패턴}과 ${변수#패턴}을 사용하면 파일 확장자 제거나 특정 패턴으로 시작하는 문자열을 간단히 처리할 수 있었습니다. 항상 까먹는 내용이긴 하지만... 간단한 쉘 스크립트 작업 시에 이러한 기능을 활용하면 코드를 더욱 간결하고 효율적으로 작성할 수 있어서 이번 기회에 잘 기억해두도록 하겠습니다! 😊