FreeBSD의 sed 정규 표현식에서 + 작업을 수행하는 방법은 무엇입니까?

FreeBSD의 sed 정규 표현식에서 + 작업을 수행하는 방법은 무엇입니까?

다음 타이프스크립트를 고려해보세요:

$ freebsd-version
10.0-RELEASE-p5
$ echo ' found' | sed -n '/[[:blank:]]\+/p'
$ echo ' found' | grep '[[:blank:]]\+'
 found

GNU를 사용하여 Arch Linux에서 이 작업을 수행할 때 sed:

$ echo ' found' | sed -n '/[[:blank:]]\+/p'
 found
$ echo ' found' | grep '[[:blank:]]\+'
 found

내가 뭐 잘못 했어요? FreeBSD에서는 왜 작동하지 않나요? 어떻게 작동하게 만들까요?

답변1

BSD sed를 사용하려면 옵션을 사용하여 ERE를 열어야 합니다 E.

echo '  found' | sed -nE '/[[:blank:]]+/p'

답변2

너무 길어요.바라보다FD0솔루션

질문하기 전에 매뉴얼 페이지를 확인했지만 Linux와 크게 다르지 않다고 생각했기 때문에 정보를 확인하지 못했습니다. 하지만,

$ man sed
...
 -E      Interpret regular expressions as extended (modern) regular
         expressions rather than basic regular expressions (BRE's).  The
         re_format(7) manual page fully describes both formats.
$ man re_format
...
 Obsolete (“basic”) regular expressions differ in several respects.  ‘|’
 is an ordinary character and there is no equivalent for its functional‐
 ity.  ‘+’ and ‘?’ are ordinary characters, and their functionality can be
 expressed using bounds (‘{1,}’ or ‘{0,1}’ respectively).  Also note that
 ‘x+’ in modern REs is equivalent to ‘xx*’.  The delimiters for bounds are
 ‘\{’ and ‘\}’, with ‘{’ and ‘}’ by themselves ordinary characters.

사용해 보았지만 {1,}중괄호를 피하는 것을 잊어버렸습니다. 그럼 확실히FD0일반적으로 솔루션이 최선의 접근 방식입니다. 그러나 다른 사람들은 다음과 같습니다.

$ echo ' found' | sed -n '/[[:blank:]]\{1,\}/p'
 found
$ echo ' found' | sed -n '/[[:blank:]][[:blank:]]*/p'
 found

그러나 그것이 무엇을 의미하는지 잘 모르겠습니다.

또한 최신 RE의 "x+"는 "xx*"와 동일합니다.

즉, 비현대적인 상황은 어떠한가 하는 것입니다.

또한 grep.dot.com 맨페이지에는 re_format항목이 언급되어 있지 않습니다. 이는 분명히 자체 정규식 구현이 있음을 의미합니다. 그 문제에 있어서는 GNU가 grep아니라 sed.

관련 정보