나는 나를 위해 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
매개변수를 사용하면 -i
sed 명령이 파일을 그 자리에서 편집합니다. .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!
변경되었습니다.
경고하다:
sed -i'.bak'
사용시 와 사이에 공간이 없는지 확인하십시오 .-i
.bak
$params
변수에 와 같은 특수 문자가 포함되어\
있으면 명령 이 실패/
하므로 접두사를 추가하여 이러한 문자를 이스케이프해야 합니다 . 예를 들어 값을 전달하려면 를 사용해야 합니다 .&
sed
\
'fuzz&'
'fuzz\&'
- 문자열을 전달할 때 큰 따옴표 대신 작은
script.sh
따옴표를 사용해야 합니다 . 사용하려는 경우 문자열에 해당 문자 (백틱) 가 포함되어 있거나 접두사를 사용하여 문자를 이스케이프해야 합니다 .'
"
"
`
\
\
./script.sh "fuzz\`" # "fuzz\`" will be "fuzz`"
#or
./script.sh "fuzz\\\\" # "fuzz\\\\" will be "fuzz\"
관찰해 주신 Frabjous와 Philippos에게 감사드립니다.