다양한 구성 파일의 $placeholder 텍스트를 $placeholder 매개변수로 바꾸기

다양한 구성 파일의 $placeholder 텍스트를 $placeholder 매개변수로 바꾸기

나는 나를 위해 sed를 구하려고 노력하고 있으며 바보처럼 느껴집니다. 그래서 누군가가 아주 간단해 보이는 일을 성취할 수 있는 더 현명한 방법을 갖고 있기를 바랍니다.

파일.conf:

USER: !USER!

스크립트.sh:

param=$1
# something to replace !USER! with $param

file.conf 실행 후 script.sh squirrel:

USER: squirrel

답변1

sed명령을 사용하여 이를 달성할 수 있습니다. 당신이 가지고 있다고 가정 해 봅시다 file.conf:

USER: !USER!
USER: !USER2!
USER: !USER
USER: !USER!

파일 에는 script.sh다음이 있어야 합니다.

#! /bin/bash

param=$1

sed -i'.bak' "s/\!USER\!/$param/" /path/to/file.conf

매개변수를 사용하면 -ised 명령이 파일을 그 자리에서 편집합니다. .bak은(는) 파일의 백업 이므로 파일이 이면 file.conf해당 백업은 입니다 file.conf.bak.

한 값을 다른 값으로 바꾸는 데 사용됩니다 "s/\!USER\!/$param/". 예를 들어, sed는 명령줄에서 지정한 문자열이 $param에 포함된 문자열을 대체 \!USER\!/$param한다는 의미입니다 .!USER!$param

script.sh마지막 으로 를 실행하면 변경된 내용을 ./script.sh squirrel볼 수 있습니다 . file.conf출력은 다음과 같습니다:

USER: squirrel
USER: !USER2!
USER: !USER
USER: squirrel

보시다시피 첫 번째 행과 마지막 행만 !USER!변경되었습니다.

경고하다:

  1. sed -i'.bak'사용시 와 사이에 공간이 없는지 확인하십시오 .-i.bak
  2. $params변수에 와 같은 특수 문자가 포함되어 \있으면 명령 이 실패 /하므로 접두사를 추가하여 이러한 문자를 이스케이프해야 합니다 . 예를 들어 값을 전달하려면 를 사용해야 합니다 .&sed\'fuzz&''fuzz\&'
  3. 문자열을 전달할 때 큰 따옴표 대신 작은 script.sh따옴표를 사용해야 합니다 . 사용하려는 경우 문자열에 해당 문자 (백틱) 가 포함되어 있거나 접두사를 사용하여 문자를 이스케이프해야 합니다 .'""`\\
./script.sh "fuzz\`" # "fuzz\`" will be "fuzz`"
#or
./script.sh "fuzz\\\\" # "fuzz\\\\" will be "fuzz\"

관찰해 주신 Frabjous와 Philippos에게 감사드립니다.

관련 정보