나는 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 스타일 정규식을 사용해 볼 수 있음을 의미합니다.