새 줄과 중괄호 일치

새 줄과 중괄호 일치

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를 사용하고 있으므로 sedif는 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(). 이를 통해 인용 작업에서 실수를 방지할 수 있습니다.

관련 정보