sed
문자열 + 개행 문자 + 왼쪽 중괄호를 일치시키려면 . 를 사용해 보세요.
sub feature_get_web_php_mode
{
my ($d) = @_;
my $server = &find_domain_server($d);
이렇게 되다
sub feature_get_web_php_mode
{
return 'fcgid';
my ($d) = @_;
my $server = &find_domain_server($d);
내 표현식 정규식은 다음과 같습니다. s|sub feature_get_web_php_mode\n{|CHANGE_CODE|
하지만 작동하지 않습니다.
여는 중괄호가 처음에 일치하지 않는 이유를 찾으려고 노력했지만 단서는 없습니다.
미리 감사드립니다.
답변1
여는 중괄호가 처음에 일치하지 않는 이유를 찾으려고 노력했지만 단서는 없습니다.
기본적으로 sed
한 번에 한 행씩 작동하므로 읽은 행이 포함될 수 없습니다 \n
. GNU를 사용하고 있으므로 sed
if는 NUL() 문자로 구분된 텍스트 블록 -z
에서 작업할 수 있는 옵션을 제공합니다. \0
명령을 변경하는 데 필요한 유일한 것은 다음 -z
옵션을 추가하는 것입니다.
sed -z "s|sub feature_get_web_php_mode\n{\n|&return 'fcgid';\n|"
입력 파일에 NUL 문자가 없을 것으로 예상하므로(일반 텍스트 파일처럼 보임) 처리할 수 있도록 메모리에 완전히 로드됩니다 sed
(프로그램 문서이므로 무해할 수 있습니다). ).
파일이 너무 큰 경우 다음 대체 버전을 사용해 볼 수 있습니다.
sed "/^sub feature_get_web_php_mode\$/ { N; s|\n{|&\nreturn 'fcgid';|; }"
참고로 다음 버전은 Posix와 엄격하게 호환됩니다.
sed "/^sub feature_get_web_php_mode\$/ { N; s|\n{|&\\
return 'fcgid';|; }"
답변2
텍스트 변경
sub feature_get_web_php_mode
{
my ($d) = @_;
my $server = &find_domain_server($d);
입력하다
sub feature_get_web_php_mode
{
return 'fcgid';
my ($d) = @_;
my $server = &find_domain_server($d);
sub feature_get_web_php_mode
다음 줄 다음의 문자열을 일치시킨 {
다음 새 줄을 삽입하여
return 'fcgid';
당신은해야합니다
sed '/^sub feature_get_web_php_mode$/ { N; /\n{$/ a\
'"return 'fcgid'"';
}' file
그러면 정확한 행을 찾습니다 sub feature_get_web_php_mode
. 발견되면 이 N
명령은 입력 버퍼에 다음 줄을 추가하고 그 사이에 줄 바꿈을 추가하는 데 사용됩니다. 다음으로, 패턴이 \n{$
일치하면 읽은 줄은 N
단일 문자이며 {
새 줄을 추가할 수 있습니다.
새로운 줄은 명령을 통해 추가됩니다 a
. 명령 a
은 다음과 같습니다
a\
text to be added
추가하려는 텍스트에 작은따옴표가 포함되어 있고 스크립트 가 작은따옴표로 묶여 있으므로 일시적으로 프로그램의 작은따옴표를 sed
분리 하고 큰따옴표 안에 텍스트를 추가합니다.sed
또는 전체 표현식을 큰따옴표로 묶으십시오( 여기서 \
다음 내용을 이스케이프해야 함을 기억하십시오 a
).
sed "/^sub feature_get_web_php_mode$/ { N; /\n{$/ a\\
return 'fcgid';
}" file
GNU를 사용하면 sed
다음과 같은 작업을 수행할 수 있습니다.
sed -e '/^sub feature_get_web_php_mode$/ { N; /\n{$/ a \' -e "return 'fcgid';" -e '}' file
다른 sed
구현에서도 실행할 수 있지만 추가된 줄 뒤에 개행 문자를 삽입하지 못할 수도 있습니다.
또 다른 방법은 패치 파일을 준비하는 것입니다.
diff -u file.old file.new >file.patch
이로 인해 패치 파일이 다음과 같이 보일 수 있습니다.
--- file.old Wed May 12 22:44:00 2021
+++ file.new Wed May 12 22:44:15 2021
@@ -1,4 +1,5 @@
sub feature_get_web_php_mode
{
+return 'fcgid';
my ($d) = @_;
my $server = &find_domain_server($d);
파일에 적용하려면 변경 사항이 포함된 새 파일을 만듭니다.
patch -o somefile.patched somefile <file.patch
그렇지 않은 경우 -o somefile.patch
변경 사항이 에 직접 적용되고 somefile
원본 파일은 으로 백업됩니다 somefile.orig
.
답변3
subroutine
코드 에서 a의 정의를 편집하려는 것 같습니다 perl
.
참고로 Perl
서브루틴은 변수처럼 정의/재정의될 수 있습니다.
이렇게 하려면 다음 세 단계를 코드에 추가하여 원하는 변경 사항을 달성하세요.
{
no warnings q(redefine);
undef &feature_get_php_mode;
*feature_get_php_mode = sub { return q(fcgid); };
}
그러나 코드를 편집해야 하는 경우 다음을 수행할 수 있습니다.
sed -e '
/^sub feature_get_web_php_mode$/!b
n;/^{$/G
s/\n/&return q(fcgid);/
' file
노트:-
- 저는 연산자를 통해 작은따옴표로 묶인 문자열을 사용하는 Perlish 방식을 사용했습니다
q()
. 이를 통해 인용 작업에서 실수를 방지할 수 있습니다.