리눅스 파일의 텍스트를 다음으로 바꾸기 sed매우 편리하긴 합니다. 하지만 이 명령어를 직접 실행하면 순식간에 설정 파일이 손상될 수도 있다는 위험도 있습니다. sed -i 제대로 다시 읽지 않았습니다.
간단한 습관을 하나 들여보시길 권합니다. 쓰기 전에 읽어라우리는 표준 출력에서 치환 결과를 테스트하고, 임시 파일로 리디렉션한 다음, 차이점을 확인하고 나서야 원본을 교체합니다. 이 과정은 다소 시간이 걸리지만, 서버에서는 불필요한 수정 작업을 방지할 수 있습니다.

sed가 실제로 무엇을 바꾸는지 이해하는 것
sed 이 함수는 텍스트 스트림을 읽고 규칙을 적용한 다음 결과를 표시합니다. 기본적으로 소스 파일을 수정하지 않습니다. 이는 명령어를 테스트할 때 사용하기에 적합한 동작 방식입니다.
sed 's/old/new/' file.conf
이 명령은 첫 번째 발생 항목을 바꿉니다. 고대의 ~에 의해 새로운 표시된 각 줄에 대해. 파일 파일.conf 그대로 유지됩니다. 따라서 아무런 위험 부담 없이 결과를 확인할 수 있습니다.
한 줄에 있는 모든 항목을 바꾸려면 플래그를 추가하세요. g :
sed 's/old/new/g' file.conf
흔히 저지르는 실수는 이 둘을 혼동하는 것입니다. g`sed`는 각 줄의 첫 번째 발생 부분만 바꿉니다. g해당 줄에서 발견된 모든 항목을 대체합니다.
원본 파일을 수정하기 전에 새 파일에서 테스트하십시오.
설정 파일의 경우, 저는 테스트 파일을 만드는 것을 선호합니다. 원본 파일을 옆에 두고 필요할 때마다 비교해 볼 수 있기 때문입니다.
sed 's/old/new/g' file.conf > file.conf.new
diff -u file.conf file.conf.new
그만큼 차이점 -u 어떤 줄이 변경되었는지 정확하게 보여줍니다. 결과가 올바르면 기존 파일을 새 파일로 교체할 수 있습니다.
file.conf 파일을 이동하고 새 file.conf 파일을 생성합니다.
중요 파일의 경우, 처리하기 전에 항상 날짜가 기재된 사본을 만들어 두십시오.
cp fichier.conf fichier.conf.bak-$(날짜 +%F-%H%M)
완벽한 백업 전략은 아니지만, 사소한 교체 오류 발생 후 이전 상태로 되돌리기에는 충분한 경우가 많습니다.
sed -i 명령어를 안전하게 사용하는 방법
옵션 -나 이 기능은 파일을 제자리에서 수정합니다. 편리하긴 하지만, 백업이나 사전 테스트 없이는 중요한 파일에 절대 사용하지 않을 것입니다.
최소 요구 사항은 sed에게 백업 복사본을 생성하도록 요청하는 것입니다.
sed -i.bak 's/old/new/g' file.conf
그러면 수정된 파일과 사본을 받게 됩니다. 파일.conf.bak교체로 인해 문제가 발생했다면 빠르게 복구할 수 있습니다.
mv fichier.conf.bak fichier.conf
일부 배포판이나 macOS에서는 다음과 같은 동작이 나타날 수 있습니다. sed -i 다를 수 있습니다. Linux GNU sed에서는, -i.bak 잘 작동합니다. 여러 시스템에서 사용할 프로시저를 작성하는 경우 항상 복사본에서 테스트하십시오.
슬래시(/)를 사용하지 않고 경로를 바꾸는 방법
체인에 다음이 포함되어 있는 경우 /기존 구문은 금세 읽기 어려워집니다.
sed 's#/var/www/html#/srv/www/site#g' nginx.conf > nginx.conf.test
여기에서는 # 구분 기호로 사용하는 대신 /명령어가 더 명확해지고 번거로운 이스케이프 처리를 여러 번 할 필요가 없습니다. 이는 경로, URL 또는 특정 구성 변수에 매우 유용합니다.
Nginx, Apache 또는 애플리케이션 파일에 이 변경 사항을 적용하기 전에 영향을 받는 줄을 확인하십시오.
diff -u nginx.conf nginx.conf.test
grep -n '/srv/www/site' nginx.conf.test
서비스 구성을 수정하는 경우, 재시작하기 전에 서비스별 테스트를 수행하십시오. Sed는 텍스트를 바꾸는 명령어이며, 애플리케이션의 구문 유효성을 검사하지 않습니다.
관련 행만 표시합니다.
파일을 수정하기 전에 검사하려면 다음 방법을 사용할 수 있습니다. sed 그리고 grep행 범위를 표시하려면 다음과 같이 하세요.
sed -n '1,80p' file.conf
그만큼 -N 파일 전체를 표시하지 않습니다. 피 요청한 범위만 출력합니다. 이는 긴 구성에서 특정 영역을 제어하는 데 유용합니다.
패턴과 일치하는 줄을 표시하려면:
sed -n '/server_name/p' nginx.conf
파일 내 검색이 주된 목적이라면, grep은 종종 더 자연스러운 표현으로 남습니다.sed는 결과를 찾는 것뿐만 아니라 변환해야 할 때 흥미로워집니다.
여러 파일을 수정할 때는 주의하십시오.
sed 명령어를 사용하면 순식간에 폴더 전체를 수정하고 싶은 유혹에 빠질 수 있습니다. 이런 경우에는 속도를 늦추는 것이 좋습니다. 먼저 목표로 하는 문자열이 실제로 포함된 파일 목록을 확인해 보세요.
grep -rl 'old' /etc/my-app
다음으로, 파일을 교체하기 전에 각 파일을 저장하는 루프를 실행합니다.
grep -rl 'old' /etc/my-app | while read -r file; do
cp "$file" "$file.bak"
sed -i 's/ancien/nouveau/g' "$file"
완료
이것은 맹목적으로 복사하라는 명령이 아닙니다. /등폴더를 조정하고 목록을 확인하세요. grep -rl그다음에는 제한된 범위에서 작업하세요. 조치를 취하기 전에 파일을 검색하려면 다음 방법도 사용할 수 있습니다. 리눅스에서 찾기.
교체 후 점검
제품 변경 후에는 주문이 접수되었다고 바로 확인하지 마세요. 최소한 다음 사항들을 확인하십시오.
- 새로운 값의 존재와 함께
grep -n 'new' file.conf; - 기존 값의 부재와 함께
grep -n 'old' file.conf; - 원본 파일과 수정된 파일의 차이점 (사본을 보관했을 경우);
- 해당 애플리케이션의 구문 테스트(존재하는 경우);
- 서비스 재시작 또는 재부팅 후 서비스 로그입니다.
로그를 확인할 때는 실시간으로 발생하는 상황을 모니터링하는 것을 잊지 마세요. 꼬리 또는 journalctl -fSed는 값을 수정할 수 있지만, 구성이 여전히 유효한지 여부는 서비스에서만 알려줍니다.
sed를 피해야 할 때
Sed는 텍스트 파일에서 간단한 치환 작업에 적합합니다. 순서, 블록 또는 따옴표가 중요한 구조화된 파일을 수정하는 데는 사용하지 않는 것이 좋습니다. JSON, 복잡한 YAML, XML 또는 매우 민감한 설정 파일의 경우, 전용 도구나 간단한 스크립트를 사용하는 것이 더 안전할 수 있습니다.
여러 파일에 영향을 미치는 마이그레이션이나 수정 작업을 준비하는 경우, 사전에 전체 백업을 수행하십시오. 아카이브 또는 로컬 복사본은 임시 해결책이 될 수 있지만, 정기적인 백업을 위해서는 다음과 같은 신뢰할 수 있는 방법을 사용하십시오. 재동기화.
더 나아가자면, GNU sed 매뉴얼 그리고 페이지 man7.org의 sed(1) 남은 것은 유용한 참고 자료들입니다. 실제 사례만큼 편리하지는 않지만, 단순한 교체를 넘어설 때 선택지를 빠르게 명확히 해줍니다.