본문 바로가기
Linux/Shell script

[sed - shell script] 동일 파일 반복 치환 후 파일 저장

by 개폰지밥 2021. 9. 28.
반응형

sed 기초 관련 : https://seul96.tistory.com/315

 

sed 사용법 및 예시

최근에 고객사마다 환경이 다르기 때문에 ip주소와 경로를 매번 수정해줘야했는데, window 환경에 notepad++과 같은 tool이 설치 되어있으면 ctrl+f를 이용하여 전체적인 수정이 가능하지만, command line

seul96.tistory.com

sed 응용 관련 : https://seul96.tistory.com/320

 

sed 실전 응용 경로를 바꾸고 싶을 때, file로 저장방법까지

| sed 기초 편 참고: https://seul96.tistory.com/315 sed 사용법 및 예시 최근에 고객사마다 환경이 다르기 때문에 ip주소와 경로를 매번 수정해줘야했는데, window 환경에 notepad++과 같은 tool이 설치 되어있..

seul96.tistory.com

 

1.1.  sed를 이용한 shell script

version1을 가장 먼저 만들었고 version3을 가장 나중에 만들었습니다.

단순히 치환만 한경우에는 version1 스크립트를 이용하시면 되고, 동일파일 치환, 파일명과 경로 받아오기, 파일저장, “/”와 같은 경로 치환 등까지 하고 싶으면 version3 sed_file_save.sh 스크립트를 이용하시면 됩니다.

(맨 아래 표에 자세히 설명되어있습니다)

 

# version3

sed_file_save.sh
0.00MB

치환 더 이상 하고 싶은 게 없을 때까지 반복 후 치환된 file을 기존 file+ 오늘 날짜로 저장한다.

vi sed_file_save.sh
#!/bin/bash
echo -e "\033[47;31m 치환을 시작합니다\033[0m "
echo -n "regexp : "
read regexp
echo -n "replacement : "
read replacement
echo -n "file_location : "
read file_location
echo -n "filename: "
read filename
cd $file_location
sed s@$regexp@$replacement@g $filename > tmp
echo -e "\033[47;31m 치환을 완료하였습니다\033[0m "
echo -n "if you wanna substitute more? y|n : "
read var
 
# 치환반복
while [ $var = "y" ]
do
echo -e "\033[47;31m 치환을 계속 합니다\033[0m "
echo -n "regexp: "
read regexp
echo -n "replacement: "
read replacement
 
sed -i.bak "s@$regexp@$replacement@g" tmp
echo -e "\033[47;31m 치환을 완료하였습니다\033[0m "
echo -n "if you wanna substitute more? y|n : "
read var
done
 
#더이상 sed를 안할 때
if [ $var = "n" ]; then
echo -n "do you wanna save file? y|n : "
        read save
 
        #file 저장
        if [ $save = "y" ]; then
        mv tmp "${filename}_$(date "+%Y-%m-%d")"
        echo -e "\033[47;31m 파일을 저장합니다\033[0m "
        else
        rm tmp*
        fi
fi
        rm tmp*
        echo -e "\033[47;31m 쉘스크립트를 종료합니다\033[0m "

 

[과정]

 

file_location은 치환하고 싶은 file의 위치

filename은 치환하고 싶은 file

그 후에 치환을 반복하면 그 위치의 파일이 계속해서 치환된다.

 

[결과]

치환된 file 오늘날짜로 자동생성

 

# version2

substitute_save2.sh
0.00MB

vi substitute_save2.sh
설명 : 치환을 더 이상 할 수 없을 때까지 반복하는 후 기존 파일에 오늘 날짜명을 받아 치환된 파일 저장
또한 file명의 위치를 받아 이동 한다.
#!/bin/bash
var="y"
echo
echo "========= 치환을 시작합니다============="
 
while [ $var = "y" ]
do
echo -n "regexp: "
read regexp
echo -n "replacement: "
read replacement
echo -n "file_location: "
read file_location
echo -n "filename: "
read filename
 
cd $file_location
 
echo "=========================================="
sed s/$regexp/$replacement/g $filename
echo "========================================="
 
echo -n "if you wanna substitute more? y|n : "
read var
done
 
if [ $var = "n" ]; then
        echo -n "do you wanna save file? y|n : "
        read save
        if [ $save = "y" ]; then
        sed s/$regexp/$replacement/g $filename > "${filename}_$(date "+%Y-%m-%d")"
        fi
echo "쉘 스크립트를 종료합니다"
fi
결과
[fido@localhost ~]$ ./substitute_save2.sh
 
=========== 치환을 시작합니다=============
regexp: 10.10.30.34
replacement: 127.0.0.1
file_location: /home/fido/MagicFIDO/tomcat9/Server/webapps/MagicFIDO2Server/WEB-INF/config/fido
filename: fido.properties
=======================================
#############################
# Common Config
#############################
 
#FIDO Server URL
fido.server.domain=http://127.0.0.1/MagicFIDO2Server/
 
include=default.properties
===============================
if you wanna substitute more? y|n : n
do you wanna save file? y|n : y
쉘 스크립트를 종료합니다

이하 생략

 
치환 결과 file

 
기타
sed의 구분자가 “/” 이기 때문에 경로와 같은 것을 치환할 때 에러문구를 뱉어낸다. 경로 치환도 될 수 있게 version3 만들기
 

 

# version1

substitute.sh
0.00MB

vi substitute.sh
설명 : 치환 할것이 없을 때까지 반복하는 스크립트
#!/bin/bash
var="y"
echo
echo "=========== 치환을 시작합니다==========="
 
while [ $var = "y" ]
do
echo -n "regexp: "
read regexp
echo -n "replacement: "
read replacement
echo -n "filename: "
read filename
 
echo "========================================"
sed s/$regexp/$replacement/g $filename
echo "========================================"
 
echo -n "if you wanna substitute more? y|n : "
read var
done
 
if [ $var = "n" ]; then
        echo "쉘 스크립트를 종료합니다"
fi
결과
[fido@localhost ~]$ cat sedtest.txt
tomcat was
jeus was
jboss was
wildfly was
oracle db
tibero db
postgresql db
cubrid db
mysql db
mssql db
mariadb db
[fido@localhost ~]$ ./substitute.sh
 
========= 치환을 시작합니다============
regexp: was
replacement: db
filename: sedtest.txt
==================================
tomcat db
jeus db
jboss db
wildfly db
oracle db
tibero db
postgresql db
cubrid db
mysql db
mssql db
mariadb db
================================
if you wanna substitute more? y|n : n
쉘 스크립트를 종료합니다
기타
쉘 스크립트가 종료되면 치환된 것들이 기존문자로 돌아오기 때문에
치환 된 것을 저장하는 version2 만들기

 

  version1 version2 version3
치환 o o o
다른 file 치환 x o o
“/”가 들어간 경로 치환 x x o
동일 file 치환 반복 x x o
파일경로 받아오기 x o o
파일명 받아오기 o o o
파일저장 x o o

 

반응형

댓글