다음 타이프스크립트를 고려해보세요:
$ 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
.