내 Linux 상자에는 사용자 정의 응용 프로그램에 대한 구성 정보가 포함된 3개의 구성 파일이 있습니다. 구성 파일의 일부 값을 변경하고 싶습니다. 파일 내용과 설명은 다음과 같습니다.
config1 파일 내용:
set VAR1=/app/client/10x_64/instance
구성 2 파일 내용:
set VAR2=/app/client/11x/instance
config3 파일 내용:
set VAR3=/app/client/11x_64/instance
모든 파일의 모든 값을 10x_64, 11x, 11x_64에서 12x_64로 변경하고 싶습니다. 현재 내용을 변경하기 위해 다음과 같은 세 가지 명령을 사용합니다.
sed -i 's/10x_64/12x_64/g' config1
sed -i 's/11x/12x_64/g' config2
sed -i 's/11x_64/12x_64/g' config3
3개 파일의 내용을 모두 변경하는 공통 명령을 원합니다.
답변1
단일 표현식을 원하면 다음과 같이 할 수 있습니다.
sed -i 's#/client/[^/]*#/client/12x_64#g' config*
나는 /client/[^/]*
태그를 사용하여 교체하려는 항목(즉, /client/
다음 항목 이후 및 이전 항목) 을 찾고 있지만 /
파일의 다른 항목 일치를 피하면 이 작업을 수행할 수 있습니다.client/[^/]*/instance
답변2
다음과 같이 간단하게 결합할 수 있습니다.
sed -i 's/10x_64/12x_64/g;s/11x/12x_64/g;s/11x_64/12x_64/g' config*
답변3
특정 버전에 필요한 구성 부분을 대체하는 "템플릿 구성 파일"을 어떻게 준비합니까? 다음과 같은 템플릿이 있다고 가정해 보겠습니다.
#/bin/bash
echo "set ##V1##=/app/client/##ARCH1##/instance" > cfg-file1
echo "set ##V2##=/app/client/##ARCH2##/instance" > cfg-file1
echo "set ##V3##=/app/client/##ARCH3##/instance" > cfg-file1
그런 다음 명령줄 인수를 기반으로 버전별로 바꾸기 명령을 실행할 수 있습니다.
#!/bin/bash
[ $# -lt 1 ] && (echo "usage: replace <version>"; exit 1;)
if [ "$1" == "1" ]; then
cat template.txt | sed -e "s/##V1##/VAR1/g;s/##ARCH1##/arch_xy_/g;s/##V2##/VAR2/g;s/##ARCH2##/arch2_xy_/g;"
# etc...
fi
이는 쉽게 확장될 수 있습니다.
답변4
세 가지 명령을 모두 하나의 표현식으로 결합할 수 있습니다. 당신이 원하는 것은 모든 사례를 1
a 0
또는 a 1
, 그 다음 an x
, 그 다음 option 으로 바꾸는 것입니다 _64
. 이는 다음과 같은 확장 정규식으로 표현될 수 있습니다.
1[01]x(_64)*
[ ]
을 나타냅니다캐릭터 클래스, 따라서 [01]
1 또는 0과 일치합니다. 이 (foo)*
구성은 0개 이상의 인스턴스와 일치합니다 foo
. 따라서 문자열 (및 와 같은 중복 항목 )과 빈 문자열이 (_64)*
일치됩니다 . 이를 통해 일치 항목이 없을 때 및 를 모두 일치시킬 수 있습니다 ._64
_64_64_64
11_x64
11x
따라서 이것을 표현식으로 결합하면 다음과 같은 결과를 sed
얻습니다.
sed -iE 's/1[01]x(_64)*/12_64/' config*