sed 명령을 사용하여 파일에서 특정 식별자를 바꾸는 스크립트를 작성 중입니다. 현재 스크립트에는 sed 명령이 하드 코딩되어 있습니다.
전 현재 방법:
s*ed 's/@Number@/ ' "${Number}" '/g; s/@Value@/ ' "${Value}" '/g;
s/@Socket@/ ' "${Socket}" '/g' File_Template > index.html*
sed 명령은 더 이상 하드 코딩되지 않으며 다양한 sed 요구 사항을 가진 많은 프로세스를 실행하고 있기 때문에 다음과 같은 작업을 수행하고 싶습니다.
목표:
INITIALIZE_SED_COMMAND='s/@Number@/ ' "${Number}" '/g;
s/@Value@/ ' "${Value}" '/g;
s/@Socket@/ ' "${Socket}" '/g;'
# Some logic happens here
INITIALIZE_SED_COMMAND="$INITIALIZE_SED_COMMAND File_Template > index.html" ;
sed $INITIALIZE_SED_COMMAND
이것은 Linux 플랫폼에서 .sh
스크립트로 작동했지만 . ksh unix
계속해서 구문 분석할 수 없습니다.
오류:
sed: s/@Number@/npdsfg/g; 파일을 찾거나 열 수 없습니다.
sed: s/@Value@/SQR 파일을 찾거나 열 수 없습니다.
sed: #s/@Socket/semi_/g; 파일을 찾거나 열 수 없습니다.
답변1
이는 Linux 기반 시스템에서 일부 비 Linux 기반 시스템(AIX, 아마도?)으로 이동한 결과가 아닙니다. 이는 쉘이 명령을 구문 분석하고 실행하는 방법에 대한 근본적인 오해입니다.
이것을 작성할 수 없으며 파일에 타임스탬프를 쓸 것이라고 기대할 수 없습니다.
v="date > /tmp/date.txt"
$v
마찬가지로 이것을 작성하여 대체를 수행하고 결과를 출력 파일에 쓰도록 할 수 없습니다.
v="s/abc/XYZ/ /tmp/source > /tmp/destination"
sed $v
변수 내에서 파일 리디렉션을 지정할 수 없습니다.
내 생각에 당신이 찾고 있는 것은 sed -f
대체 파일을 생성하고 이를 소스 데이터 파일에 적용할 수 있는 것입니다.
#!/bin/ksh
# Usage: thisprogram <transform_file> <src_file> <dst_file>
#
transform="$1"
src="$1"
dst="$2"
sed -f "$transform" "$src" >"$dst"
변환 파일에는 다음과 같은 작업이 포함될 수 있습니다.
s/@Number@/1234/g
s/@Value@/somevalue/g
s/@Socket@/99b44/g
분명히 특정 실행의 맥락 내에서 이를 준비해야 합니다.
귀하의 질문에 더 자세한 내용을 추가하면 이 솔루션을 더 발전시킬 수 있지만 여기에는 귀하의 특정 사용 사례에 맞게 재작업할 수 있는 충분한 정보가 있다고 믿습니다.