xargs를 사용하여 텍스트 파일의 특정 단어를 바꾸는 방법은?
_____Q1. xargs란 무엇인가요?
A1. xargs는 표준 입력으로 받은 문자열(파일명·문자열 등)을 인수로 변환하여 지정된 명령에 전달하는 유틸리티입니다. 주로 find, grep 같은 명령과 조합해 많은 파일 또는 문자열을 일괄 처리할 때 사용합니다.
Q2. 왜 xargs를 써야 하나요?
A2.
- 한 번에 너무 많은 인자를 전달할 때 쉘 인수 길이(limit) 문제를 회피
- find, grep 등에서 출력된 결과를 효율적으로 후속 처리
- 병렬 처리(-P), null 문자 처리(-0) 등 유연한 옵션 제공
Q3. 기본적인 단어 교체 예시는?
A3. 현재 디렉터리(. ) 이하의 모든 `.txt` 파일에서 `OLD`를 `NEW`로 바꾸려면:
```
find . -type f -name "*.txt" \
| xargs sed -i 's/OLD/NEW/g'
```
Q4. 파일명에 공백이나 특수문자가 포함돼 있다면?
A4. find의 `-print0`, xargs의 `-0` 옵션을 사용해 null 문자로 구분:
```
find . -type f -name "*.txt" -print0 \
| xargs -0 sed -i 's/OLD/NEW/g'
```
Q5. sed 작업 시 백업 파일(.bak 등)을 남기려면?
A5. sed `-i` 뒤에 확장자를 지정:
```
find . -type f -name "*.txt" -print0 \
| xargs -0 sed -i.bak 's/OLD/NEW/g'
```
실행 후 `file.txt.bak` 형태의 백업본이 생성됩니다.
Q6. 교체할 패턴이 여러 개일 때는?
A6. sed 스크립트에 세미콜론(;)으로 구분하거나 `-e` 옵션을 여러 번:
```
| xargs -0 sed -i \
-e 's/FOO/BAR/g' \
-e 's/ABC/XYZ/g'
```
Q7. 대소문자 구분 없이 교체하려면?
A7. sed의 `I` 플래그를 사용:
```
find . -name "*.txt" -print0 \
| xargs -0 sed -i 's/old/new/gi'
```
Q8. 처리 속도를 높이려면?
A8. xargs의 `-P` 옵션으로 병렬 실행:
```
find . -name "*.txt" -print0 \
| xargs -0 -P4 sed -i 's/OLD/NEW/g'
```
여기서 `-P4`는 최대 4개 프로세스를 동시에 실행합니다.
Q9. 특정 디렉터리만 대상으로 삼으려면?
A9. find 조건을 추가:
```
find /path/to/dir -maxdepth 2 -type f -name "*.log" -print0 \
| xargs -0 sed -i 's/ERROR/WARN/g'
```
Q10. xargs 없이 바로 sed를 쓰는 방법과 장단점은?
A10.
- 직접 glob 확장: `sed -i 's/OLD/NEW/g' *.txt`
장점: 단순한 디렉터리, 파일 수 적을 때 빠름
단점: 서브디렉터리 미포함, 공백 있는 파일명 처리 곤란, 인수 길이 제한
- xargs 조합 시 대규모·다계층 구조·특수문자 포함 파일 안전 처리 가능
–––––
위 FAQ를 참고하여 xargs와 sed를 조합하면 대규모 텍스트 파일 일괄 단어 교체 작업을 안정적·효율적으로 수행할 수 있습니다.
작성자:
정하은 [비회원]
| 작성일자: 1년 전
2025-04-17 07:21:22
조회수: 149 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 149 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.