$variable
불확실한 수의 텍스트 줄을 저장하는 스크립트가 있습니다 . 내가 이름을 지정했고 script.bash
다음 위치에 있다고 가정해 보겠습니다 $HOME
.
#!/bin/bash
# commands on the beginning of my script
variable='Lorem Ipsum is simply dummied
text of the printing and
typesetting industry. Lorem Ipsum has been the
industry standard dummy text ever since the 1500s'
# commands at the end of my script
variable
의 텍스트를 변경하는 새 스크립트를 만들고 싶습니다 script.bash
. 코드의 아이디어는 다음과 같습니다.
#!/bin/bash
file="$HOME/script.bash"
mynewvariable='one
two
three'
substitute_everything_inside_variable () {
# code
}
substitute_everything_inside_variable "$mynewvariable" "$file"
한 줄이면 sed
다음과 같이 전체 줄을 새 줄로 바꿀 수 있습니다.
sed -i "5s/.*/$mynewvariable/" "$HOME/script.bash"
그러나 작은 따옴표 안의 모든 내용을 바꿔야 한다는 점(그리고 그 안의 텍스트 줄 수는 가변적임)을 고려하면 명령줄 도구를 사용하여 이 작업을 수행하는 방법을 모르겠습니다. 각 줄에서 무슨 일이 일어나고 있는지 읽고 해석하지 않고 이를 수행할 수 있는 방법이 있습니까?
답변1
중단하고 싶지 않은 다른 내용이 많이 포함된 파일에서 여러 줄로 묶인 인용 문자열을 변경하는 것보다 파일의 전체 내용을 바꾸는 것이 훨씬 쉽습니다.
내용을 $variable
파일(예 vfile.txt
: )에 넣고 쉘 스크립트에서 이와 같은 작업을 수행하도록 하십시오 variable="$(cat vfile.txt)"
.
그런 다음 교체하거나 수정하려는 방법을 사용할 수 있습니다 vfile.txt
.
답변2
Sed에는 Except 이 있습니다 s
. 시작 행을 찾고 값의 마지막 부분까지 모든 행을 삭제한 다음 새 값을 삽입할 수 있습니다. 하지만 올바르게 인용하는 것은 어렵습니다. s/…/$mynewvariable/
개행 문자뿐만 아니라 '
, \
및 /
. Perl에서 하는 것이 더 쉽습니다.
파일이 너무 커서 메모리에 맞지 않으면 Perl에게 파일을 한 줄씩 나누는 대신 전체 파일을 읽도록 지시하십시오. 검증되지 않은.
mynewvariable=$mynewvariable perl -0777 -i -p -e '
$replacement = $ENV{mynewvariable};
$replacement =~ s/\x27/\x27\\\x27\x27/g;
s/^variable=\x27(?:[^\x27]|\x27\\\x27\x27)*\x27/$replacement/;
' "HOME/script.bash"
설명하다:
perl -0777 -i -p
파일 내용에 대해 Perl 프로그램을 실행하고 파일을 바꾸십시오.-0777
한 줄씩 처리하는 것이 아니라 전체 파일을 한 번에 처리하는 것을 의미합니다.sed s/…/$mynewvariable/
변수를 Perl 프로그램에 연결하면 문자열 대신 Perl 코드로 해석되기 때문에(작동하지 않는 것과 같은 이유) 환경을 통해 변수를 전달하고 있습니다.\x27
작은 따옴표입니다(Perl 코드를 작은 따옴표 안에 넣었으므로 안에 작은 따옴표를 사용할 수 없습니다).$replacement =~ …
작은따옴표로 묶인 쉘 문자열 리터럴 내부의 값을 바꿉니다'
.'\''
'
(?:[^\x27]|\x27\\\x27\x27)
'\''
가 아닌 모든 문자 와 일치합니다'
.
답변3
변수가 있는 script.bash 파일의 줄 번호를 알고 있으므로 다음을 수행할 수 있습니다.
#!/bin/bash
file="$HOME/script.bash"
mynewvariable='one
two
three'
substitute_everything_inside_variable () {
tmpf=$(mktemp)
printf '%s\n' "$1" |
sed -e "s/'/'\\\''/g" -e 1s/^/variable=\'/ -e \$s/\$/\'/ > "$tmpf"
sed -i -e "4r $tmpf" -e '5s/^/#/' "$2"
rm -f "$tmpf"
}
substitute_everything_inside_variable "$mynewvar" "$file"
#### eof #####
이렇게 하면 $variables에 대한 참조의 모호함과 알 수 없는 줄 범위를 피할 수 있습니다.
화타이