텍스트 파일에서 자리 표시자 목록을 바꾸는 방법은 무엇입니까?

텍스트 파일에서 자리 표시자 목록을 바꾸는 방법은 무엇입니까?

텍스트(구성) 파일이 있지만 불행하게도 파일을 읽는 프로그램은 어떤 종류의 변수도 허용하지 않습니다. 그래서 구성 파일을 프로그램에 전달하기 전에 전처리기를 사용하여 구성 파일의 자리 표시자 세트를 바꾸고 싶습니다.

원하는 방식으로 변수의 형식을 정의할 수 있습니다(예 §SOME_DIR: ). 변수가 몇 개만 있는 경우 다음을 사용할 수 있습니다 sed.

sed  -e "s*§SOME_DIR*$SOME_DIR*g"  my.conf | target_prog

그러나 변수 목록은 상당히 길고 구성하기 쉬워야 합니다. 따라서 변수를 속성 파일에 넣는 것을 선호합니다.

SOME_DIR=...
OTHER_DIR=...
...

그럼 전화해

some_replace_tool  my.properties  my.conf  | target_prog

"some_replace_tool"을 찾고 있습니다. 어떤 아이디어가 있나요?

답변1

출력 구성 파일을 생성하기 위해 쉘 변수를 확장하는 스크립트를 작성할 수도 있습니다.

다음은 몇 가지 팁입니다.

  1. 여기서 문자열(<<<)이 확장됩니다.
  2. ".variables.conf"를 통해 변수를 로드할 수 있습니다.
  3. env -i script.sh깨끗한 환경에서 스크립트를 실행합니다(추가 변수 없음).

따라서 스크립트는 변수를 가져오고 확장된 변수를 사용하여 이 문자열을 분류하는 새로운 임시 스크립트를 작성해야 합니다. 그런 다음 최종 출력을 얻으려면 임시로 생성된 스크립트를 실행해야 합니다 env -i.

답변2

@fred에는 몇 가지 좋은 아이디어가 있지만 더 간단한 시스템은 다음과 같습니다.

sed -ne '/^#/d;s!^\([^=]*\)=\(.*\)$!s@\1@\2g!p' my.proprties > script.sed
sed -f script.sed my.conf | target_prog

또한 "PROP=VALUE"가 있는 행만 생성되고 주석 처리된 행은 무시됩니다.

이것을 분석해 보세요:

/^#/d                   - delete any comment lines (to ignore #PROP=VALUE)
s!^\([^=]*\)=\(.*\)$    - match any line with PROP=VALUE and place PROG into group 1 and VALUE into group 2
!s@\1@\2@g              - replace with s@GROUP1@GROUP2@g
!p                      - print the line, to override the -n

다음과 같은 sed 스크립트가 생성됩니다.

s@PROP1@VALUE1@g
s@PROP2@VALUE2@g
...

답변3

전통적인 UNIX 전처리기라고 주장할 수 있는 두 가지 전처리기가 있습니다.프로그램 파일(C 전처리기) 및m4. 둘 다 텍스트의 단어를 대체하고 cpp의 경우 주석 구문을 적용하므로 일반적인 전처리에는 적합하지 않습니다. 합리적인 범용 전처리기에는 매크로 지시문이 있습니다(예: 가 나타날 때마다 확장하지 않고 name확장만 수행 @name(예: )).

나는 어떤 전처리기가 사실상의 표준이거나 심지어 보편적이라고 생각하지 않습니다. 다양한 입력 형식과 작동하고 많은 Linux 배포판에서 사용할 수 있는 도구 중 하나는 다음과 같습니다.기본 계획.

표준 도구를 고수하려면 경우에 따라 셸을 전처리기로 사용할 수 있습니다. 문자열을 작성한 후 실행

eval 'preprocessed=$(cat <<EOF)
$template
EOF'

쉘 매개변수 및 명령( $var, $(command), `command`)이 확장됩니다. 템플릿이 외부 명령을 호출하거나 스크립트에서 사용하는 변수에 할당하는 것을 쉽게 방지할 수 없으므로 템플릿 소스를 신뢰하지 않는 한 이 기능을 사용하지 마십시오.

답변4

업데이트: sed-to-sed 아이디어를 확장하면 인라인 Arcege일 수 있고 중간 파일이 필요하지 않은 find/repl 템플릿에 대해 보다 관리하기 쉬운 레이아웃(테이블 형식 또는 비정형)을 제공할 수 있습니다 . 줄당 변경 사항... , 등은 정규식 으로 처리됩니다 .gp'<<'EOF'foobarbarsed

I=$'\01'; sed -nre "s/^([^ ]+) +/s$I\1$I/;s/$/$I/p"<<'EOF' |sed -f - file
foo           By the middle of June,
barbar        mosquitos were rampant,
foofoofoo     the grass was tawny, a brown dust
barbarbarbar  haze hung over the valley
EOF

(원래 게시물)
sed래퍼를 사용하여 실행 가능한 스크립트로 사용할 수 있습니다 .

별도의 텍스트 파일에서 찾기 및 바꾸기 텍스트를 정의할 수 있지만
이 예에서는 인라인으로 정의되었습니다.

이 스크립트는 find/repl 쌍을 sed 표현식으로 변환하고 실행 가능한 스크립트를 동적으로 생성합니다.

I=$'\01'; set -f
printf "#!/bin/sed -f\n" > ~/bin/script.sed
while IFS= read -r line ;do
    ix=$(expr index "$line" " ")
    printf "s%s%s%s%s%s\n" $I ""${line:0:$((ix-1))}"" $I "${line:$ix}" $I 
done <<'EOF' >> ~/bin/script.sed
$text1 By the middle of June,
$text2 mosquitos were rampant,
$text3 the grass was tawny, a brown dust
$text4 haze hung over the valley
EOF
chmod +x ~/bin/script.sed

수정할 테스트 파일입니다.
'$'는 (sed의 경우) 줄 끝에 있지 않고 언제든지 쉘에 노출되지 않기 때문에 괜찮지만, 충돌하지 않는 태그는 괜찮습니다 sed. 당신은 사용할 수도 있습니다#

echo '$text1 $text2 $text3 $text4' > file  

$PATH 디렉토리라고 가정하면 ~/bin실행할 명령은 다음과 같습니다.

script.sed  file   

관련 정보