명령줄 도구를 사용하여 작은따옴표 안에 여러 줄의 텍스트를 바꾸는 방법은 무엇입니까?

명령줄 도구를 사용하여 작은따옴표 안에 여러 줄의 텍스트를 바꾸는 방법은 무엇입니까?

$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에 대한 참조의 모호함과 알 수 없는 줄 범위를 피할 수 있습니다.

화타이

관련 정보