저는 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
분명히 특정 실행의 맥락에서 이를 준비해야 합니다.
문제에 대한 자세한 내용을 포함하여 이 솔루션을 추가로 적용하는 것이 가능할 수도 있지만 여기에는 특정 사용 사례에 맞게 다시 설계할 수 있는 충분한 정보가 있다고 생각합니다.