> 텍스트 처리 및 검색 > awk-gsub

awk-gsub: 전역 문자열 치환

awk 명령어 내에서 사용되는 `gsub` 함수는 특정 정규 표현식과 일치하는 모든 문자열을 다른 문자열로 전역적으로 치환하는 데 사용됩니다. 파일 내용이나 스트림에서 여러 번 나타나는 패턴을 일괄적으로 변경할 때 매우 유용합니다.

개요

`gsub`는 Global Substitution의 약자로, `awk` 스크립트 내에서 특정 정규 표현식과 일치하는 모든 부분을 지정된 문자열로 변경하는 함수입니다. `sub` 함수가 첫 번째 일치 항목만 변경하는 것과 달리, `gsub`는 모든 일치 항목을 변경합니다.

gsub 함수 구문

gsub(정규표현식, 치환문자열, [대상문자열])

  • 정규표현식 (regex): 찾을 패턴을 정의하는 정규 표현식입니다.
  • 치환문자열 (replacement): 찾은 패턴을 대체할 문자열입니다.
  • 대상문자열 (target_string): 치환 작업을 수행할 문자열입니다. 생략하면 현재 레코드 전체($0)에 적용됩니다.

반환 값

`gsub` 함수는 치환이 발생한 횟수를 정수로 반환합니다. 이 반환 값은 조건문 등에서 유용하게 사용될 수 있습니다.

사용 예시

`gsub` 함수를 활용한 다양한 문자열 치환 예시입니다.

파일 내 모든 'old'를 'new'로 치환

echo 'This is an old file with old data.' > data.txt
awk '{gsub(/old/, "new"); print}' data.txt

data.txt 파일에서 'old'라는 단어가 나타나는 모든 곳을 'new'로 변경합니다. 변경된 내용을 출력합니다.

공백을 하이픈으로 치환

echo 'Hello World from Awk' | awk '{gsub(/ /, "-"); print}'

입력된 문자열의 모든 공백을 하이픈(-)으로 변경합니다.

특정 필드 내에서만 치환

echo 'field1 field2 apple' | awk '{gsub(/a/, "X", $3); print}'

세 번째 필드($3) 내에서만 'a'를 'X'로 치환합니다. (예: 'apple banana cat' -> 'apple banana cXt')

대소문자 구분 없이 치환

echo 'Apple is an apple.' | awk 'BEGIN {IGNORECASE=1} {gsub(/apple/, "orange"); print}'

`IGNORECASE` 변수를 1로 설정하여 대소문자를 구분하지 않고 'apple'을 'orange'로 치환합니다.

숫자만 제거

echo 'Product ID: 12345 ABC' | awk '{gsub(/[0-9]/, ""); print}'

문자열에서 모든 숫자를 제거합니다.

팁 & 주의사항

`gsub` 함수를 사용할 때 유용한 팁과 주의해야 할 점들입니다.

sub 함수와의 차이점

`gsub`는 모든 일치 항목을 치환하는 반면, `sub` 함수는 첫 번째 일치 항목만 치환합니다. 필요에 따라 적절한 함수를 선택하세요.

  • `gsub(regex, replacement, target)`: 모든 일치 항목 치환
  • `sub(regex, replacement, target)`: 첫 번째 일치 항목만 치환

정규 표현식 특수 문자

정규 표현식 내에서 `.` `*` `+` `?` `[` `]` `(` `)` `|` `^` `$` `\` 등의 특수 문자를 리터럴로 사용하려면 `\`로 이스케이프해야 합니다. 예를 들어, 실제 점(.)을 찾으려면 `\.`으로 사용합니다.

대상 문자열 생략 시 주의

`target_string`을 생략하면 기본적으로 현재 레코드 전체($0)에 치환 작업이 적용됩니다. 특정 필드에만 적용하려면 반드시 `gsub(regex, replacement, $N)` 형태로 필드를 지정해야 합니다.

치환 문자열 내 백슬래시

치환 문자열 내에서 백슬래시(`\`)는 특별한 의미를 가질 수 있습니다. 예를 들어, `\&`는 일치하는 전체 문자열을 나타냅니다. 리터럴 백슬래시를 사용하려면 `\\`와 같이 두 번 이스케이프해야 합니다.


동일 카테고리 명령어