이메일 주소가 포함된 PHP 파일이 있고 $to = "example-1_2@example-1_2.com";
해당 이메일 주소를 터미널에서 직접 다른 주소로 바꾸고 싶습니다.
다음 코드는 다음을 기반으로 합니다.Kuslanada의 또 다른 유사한 코드일하다:
read new_email_address
sed -i 's/$to = ".*";$/$to = "'"$new_email_address"'";/' FILE
Kuslananda는 댓글에서 다음과 같이 말했습니다.
- 내 표정은일련의작은따옴표로 묶인 문자열, 큰따옴표로 묶인 문자열(변수), 또 다른 짧은 작은따옴표로 묶인 문자열
2년에 한 번씩 사용하는 비전문 시스템 관리자로서 sed
저는 이 구문을 기억하기가 다소 어렵고 정기적으로 사용하지 않는 저와 같은 사람에게는 다소 혼란스럽다고 생각합니다(Kuslananda에서 제공한 인용 규칙은 약간 혼란스럽습니다). 나, 전체 sed
명령이 일반적으로 작은따옴표로 묶여 있다는 것은 말할 것도 없습니다.)
어쩌면 Shanti Nanda의 명령을 다른 사람과 나 자신이 더 "직관적"이거나 "이해하기 쉽게" 만들 수 있는 방법이 있을 수도 있습니다. 명령을 분리하는 백슬래시가 도움이 될 수도 있고, 이런 종류의 텍스트 교체를 수행하는 데 다른 유틸리티가 더 적합할 수도 있습니다.
명령줄에서 (PHP) 파일의 이메일을 바꾸는 방법아니요 sed
?
답변1
인용된 쉘 변수는 외부 인용 수준이 큰따옴표로 묶인 경우에만 확장됩니다. 표시하려면:
$ var=foo
$ echo '"$var"'
"$var"
$ echo "'$var'"
'foo'
따라서 변수는 다음과 같은 경우에만 확장됩니다.밖의주변의 제안 수준은 두 배입니다.
다음 문제는 정규식이 잘못되었다는 것입니다. $
정규식에서 "줄 끝"을 의미하므로 이들 중 하나 이상을 가질 수 없습니다 $
. 이 정규식으로 무엇을 하려는지 잘 모르겠습니다. 따라서 문자열 뒤에 있는 이메일 주소를 변경하고 싶다고 가정합니다 $to =
. 그렇다면 다음을 시도해 보십시오.
sed -i "s/\\$to = \"[^\"]*\"/\\$to = $new_email_address/" FILE
변수로 읽히는 것을 방지하기 위해 "
( \"
) 및 $
( )를 이스케이프해야 했기 때문에 개구부가 내부적으로 닫히지 않았습니다 . 또한 쉘이 이를 보지 않고 대신 sed에 전달하도록 또 다른 이스케이프 레이어( )를 추가해야 했습니다 . 예, 이것이 매우 복잡하다는 것을 알고 있습니다.\$to
$to
"
"
\\$
$
또는 원하는 대로 여러 개의 작은따옴표 및 큰따옴표 표현식으로 나눌 수 있습니다.
sed 's/\$to = "[^"]*"/$to = '"$new_email_address"'/' FILE
답변2
당신은 그것을 사용할 수 있습니다앗유틸리티는 명령줄에서 -F 옵션을 사용하여 설정한 구분 기호로 구분된 필드를 기반으로 행을 봅니다.
read new_email_address
awk -F '"' -v new="$new_email_address" '
$1 == "$to = " {$2 = new}
1' OFS='"' your_phpfile
awk -v q=\" -v new="$new_email_address" '
BEGIN {
new_esc = new
gsub(/[&]/, "\\\\&", new_esc)
repl = q new_esc q";"
}
sub(\
/\$to = ".*";$/, \
"$to = " repl \
)+1' your_phpfile