ssed(Super sed)의 여러 줄 수정자를 사용하는 방법은 무엇입니까?

ssed(Super sed)의 여러 줄 수정자를 사용하는 방법은 무엇입니까?

나는 Perl의 정규식 패턴을 지원하고 sed의 크게 향상된 버전인 ssed라는 도구를 발견했습니다.https://launchpad.net/ssed/

이 명령은 작동하지 않는 것 같습니다:

printf 'a\nBc\n' | ssed -R 's/a(?m)\nBc\n/X\n/'

내 예상 결과는 다음과 같습니다

X

하지만 다음과 같이 인쇄됩니다.

a
Bc

여러 줄 처리에 Perl을 사용할 수 있다는 것을 알고 있지만 현재는 ssed에서 사용할 수 있는 옵션을 살펴보고 싶습니다.

편집: 이것은 런치패드 페이지에서 가져온 것입니다:

(7) Perl-style regular expressions, with examples. Use the -R switch.
    Used in /addressing/ or the FIND side of s/// commands.

  (?i)abc - case-insensitive match of abc, ABC, aBc, ABc, etc.
  ab(?i)c - same as above; the (?i) applies throughout the pattern
  (ab(?i)c) - matches abc or abC; the outer parens make the difference!
  (?m) - multi-line pattern space: same as "s/FIND/REPL/M"

참고: 저는 이 perl 명령을 에뮬레이션하려고 합니다.

 seq 10 | perl -p0e 's/\n/:/g'

산출:

1:2:3:4:5:6:7:8:9:10:

답변1

그러나 일치를 시작하기 전에 먼저 다중 라인 패턴 공간을 준비해야 합니다. 이는 N/G/H 명령을 통해서만 달성할 수 있습니다. 패턴 공간은 이제 한 번에 한 줄입니다.

Ssed는 sed 변장을 한 Perl이 아니지만 단지 Perl의 정규식 기능을 구현한 것뿐입니다. Perl -0pe 명령의 경우 -z 옵션을 사용할 수 있으면 시도해 볼 수 있고, 그렇지 않으면 언제든지 수행할 수 있습니다.

seq 10 |
ssed -e '
  :loop
  $!{
    N
    b loop
  }
  G
  s/\n/:/g
'
1:2:3:4:5:6:7:8:9:10:

피복재:

  • N 명령은 패턴 공간에 다음 줄을 추가합니다.
  • 루프 내에서 N 명령을 적용하면 곧 모든 줄이 패턴 공간에 있게 되고 각 줄은 개행 문자로 다음 줄과 구분됩니다.
  • 그런 다음 파일이 고갈되면(eof에 도달했음을 의미) 각 개행 문자를 콜론으로 바꿉니다.
  • G 명령은 예약된 공간을 패턴 공간에 추가합니다. 이는 패턴 공간에 개행 문자를 추가하는 것을 의미합니다.

Perl 스타일 정규식은 여기에 포함되지 않으므로 -R 옵션이 필요하지 않습니다. 그러나 패턴 공간은 전체 데이터를 패턴 공간으로 읽어왔기 때문에 여러 줄입니다. 이는 이제 이 패턴 공간에서 Perl 스타일 정규식을 사용해 볼 수 있음을 의미합니다.

관련 정보