다음 코드 줄이 포함된 PHP 파일이 있다고 가정해 보겠습니다.
$to = "example-1_2@example-1_2.com";
) 을 나타내기 위해 두 개의 큰따옴표 사이에서 이메일 주소를 변경하고 싶습니다 [email protected]
.
나는 성공하지 않고 이것을 시도했습니다.
read new_email_address
sed -i 's/^[a-zA-Z0-9-_]*$@^[a-zA-Z0-9-_]*$.^[a-z]*$/"${new_email_address}"/g' FILE
답변1
귀하의 질문에 업데이트된 명령에 대한 간단한 설명이 있습니다 sed
. 현재 다음과 같습니다.
sed -i 's/^[a-zA-Z0-9-_]*$@^[a-zA-Z0-9-_]*$.^[a-z]*$/"${new_email_address}"/g' FILE
여기에는 두 개의 유효하지 않은 문자 범위(둘 다 read 0-9-_
)가 포함되어 있으며 변수는 new_email_address
작은따옴표로 묶인 문자열 안에 있기 때문에 셸에 의해 확장되지 않습니다. 또한 $@^
and 의 의도가 무엇인지 잘 모르겠습니다 $.^
. 왜냐하면 $
and 는 ^
표현식의 해당 위치에 있는 문자를 문자 그대로 일치시키기 때문입니다.
이 변수가 파일의 나머지 부분에서 어떻게 사용되는지 보지 않고 $to
이 변수가 한 위치에만 할당되고 표시되는 줄이 파일의 줄과 정확히 동일하다고 가정하겠습니다.
sed 's/$to = ".*";$/$to = "'"$new_email_address"'";/' file >file.new
$to
변수에 이메일 주소가 포함되어 있다는 것을 이미 알고 있으므로 이메일 주소를 일치시키려고 시도할 필요가 없습니다 . 우리가 걱정해야 했던 유일한 것은 올바른 선을 찾으려고 노력하는 것이었습니다. 이메일 주소를 정규 표현식과 일치시키는 것은 다음과 같은 경우로 악명이 높습니다.딱딱한.
다음은 참고할 몇 가지 사항입니다.
- in은 표현식 끝에 나타나지 않으므로 특별한 처리가 필요하지 않습니다
$
. 확장 정규식을 활성화$to
하려면-E
먼저 이를 수행하지 말고 두 번째로$
패턴에서와 같이 in을 이스케이프하십시오.$to
\$
- 이 문자열
$to
은아니요작은따옴표로 묶여 있으므로 쉘 변수로 처리됩니다. $new_email_address
예쉘 변수이므로 변수 값(큰따옴표)을 도입하기 위해 일시적으로 작은따옴표를 분리합니다.
-i
대체가 올바른지 또는 파일이 엉망이 될지 아직 알 수 없기 때문에 여기서는 사용하지 않는 것이 좋습니다 . 결과를 새 파일 이름에 쓰는 것이 좋습니다.
또한 를 전달하여 백업 파일로 사용할 접미사를 -ir
나타냅니다 . 나는 당신이 그 옵션 (또는 더 일반적으로 지원될 것)을 사용하기를 원한다고 가정합니다. 그러나 이 간단한 대체를 위해 확장 정규식을 사용하지 않기 때문에 둘 다 필요하지 않습니다.sed
r
-r
-E
-r
-E
위 명령을 테스트해 보세요.
$ cat file
$to = "example-1_2@example-1_2.com";
$ [email protected]
$ sed 's/$to = ".*";$/$to = "'"$new_email_address"'";/' file >file.new
$ cat file.new
$to = "[email protected]";
답변2
(1)이 두 개의 큰따옴표 사이에 있고 (2) 중간에 @가 있는 문자열을 바꾸려면 다음 정규식이 일치합니다.
"[a-zA-Z_.-]*@[a-zA-Z_.-]*"
대시는 각 문자 클래스의 끝에 있어야 하며 @ 앞뒤에 점을 추가했습니다.
이론적으로는 %와 같은 다른 문자도 가능합니다. 조사한 후에 이메일 주소와 이보다 더 잘 일치하는 정규식을 찾을 수 있지만, 우리는 귀하의 이메일 주소가 이 표현식과 일치한다고 가정합니다.
문제는 sed
프로그램의 대체 문자열에 있습니다. 여기에는 쉘 변수가 포함되어 있고 정규 표현식에도 큰따옴표가 포함되어 있으므로 큰따옴표 사이에 넣어야 합니다.
제 생각에는 이 문제를 처리하는 가장 쉬운 방법은 큰따옴표 앞에 백슬래시를 추가하는 것입니다. 예를 들어
sed "s/\"[a-zA-Z0-9_.-]*@[a-zA-Z0-9_.-]*\"/\"${new_email}\"/"