리눅스 bash에서 가끔 문자열 변수를 조작할 일이 있는데, 자주 사용하지 않다보니 매번 사용할 때마다 검색을 해보곤 한다. 그래서 그냥 내가 자주 사용하는 핵심 몇가지만 정리해 두려 한다.



1. 변수 앞에서 몇개만 잘라내기


python의 slice랑 비슷하지만 조금 다르다. Index는 python과 동일하게 Zero-based index를 사용한다.


${변수명:시작지점}    => 시작지점부터 끝까지

${변수명:시작지점:갯수}    => python과 달리 끝지점이 아닌 갯수임에 유의


[root@NETo-c7test01 ~]# AAA="ABCDEFGH"
[root@NETo-c7test01 ~]# echo ${AAA:0}
ABCDEFGH
[root@NETo-c7test01 ~]# echo ${AAA:4}
EFGH
[root@NETo-c7test01 ~]# echo ${AAA:2:3}
CDE


끝나는 지점을 지정하고 싶으면 갯수 대신 음수로 넣으면 python의 slice와 동일하게 작동한다. 단 끝지점은 열린 구간으로 포함되지 않는 Index이다.


${변수명:시작지점:음수끝지점}    => 음수로 표현되며, -1이 가장 마지막 문자이고, 끝지점은 포함되지 않는다.


[root@NETo-c7test01 ~]# AAA="ABCDEFGH" [root@NETo-c7test01 ~]# echo ${AAA:2:-2} CDEF



2. 변수 뒤에서 몇개만 잘라내기


사실 위 변수 앞에서 자르기 개념과 동일한데, 시작 지점을 음수로 적용하는 것이다. 단 음수 시작지점은 한칸 띄우거나 괄호로 묶어줘야 한다.


${변수명: 음수시작지점}

${변수명:(음수시작지점)}

${변수명: 음수시작지점:갯수}

${변수명: 음수시작지점:음수끝지점}


[root@NETo-c7test01 ~]# AAA="ABCDEFGH" [root@NETo-c7test01 ~]# echo ${AAA: -4} EFGH [root@NETo-c7test01 ~]# echo ${AAA:(-4)} EFGH [root@NETo-c7test01 ~]# echo ${AAA: -4:2} EF [root@NETo-c7test01 ~]# echo ${AAA: -4:-3} E



3. 변수 일부 문자열 삭제하기


${변수명#삭제문자}    => 시작지점을 포함하여 가장 짧게 매칭되는 패턴 삭제

${변수명##삭제문자}    => 시작지점을 포함하여 가장 길게 매칭되는 패턴 삭제

${변수명%삭제문자}    => 끝지점을 포함하여 가장 짧게 매칭되는 패턴 삭제

${변수명%%삭제문자}    => 끝지점을 포함하여 가장 길게 매칭되는 패턴 삭제


와일드카드 ?, * 활용 가능하다.


[root@NETo-c7test01 ~]# AAA="AAABBBCCCBBBDDDAAA"
[root@NETo-c7test01 ~]# echo ${AAA#A*B}
BBCCCBBBDDDAAA
[root@NETo-c7test01 ~]# echo ${AAA##A*B}
DDDAAA
[root@NETo-c7test01 ~]# echo ${AAA%B*A}
AAABBBCCCBB
[root@NETo-c7test01 ~]# echo ${AAA%%B*A}
AAA



4. 변수 일부 문자열 치환하기


사실 본인은 치환의 경우 pipe로 보내서 sed, perl을 활용하는 편이기는 하다. 그래서 이건 복잡한거 빼고 기본 예제만 남겨둔다. * 을 사용하면 greedy 하게 매칭한다.


${변수명/찾을패턴/바꿀문자}    => 처음 매칭되는 1개만 변경

${변수명//찾을패턴/바꿀문자}    => 매칭되는 전체 변경


[root@NETo-c7test01 ~]# AAA="AAABBBCCCBBBDDDAAA"
[root@NETo-c7test01 ~]# echo ${AAA/BBB/111}
AAA111CCCBBBDDDAAA
[root@NETo-c7test01 ~]# echo ${AAA//BBB/111}
AAA111CCC111DDDAAA
[root@NETo-c7test01 ~]# echo ${AAA/B*D/111}
AAA111AAA



5. 변수 길이 구하기


변수명 앞에 # 을 붙여준다.


${#변수명}


[root@NETo-c7test01 ~]# AAA="ABCDEFGH"
[root@NETo-c7test01 ~]# echo ${#AAA}
8