공백이 추가되는 이유는 무엇입니까? echo "x 축" | sed 's/x\s*/x /'

공백이 추가되는 이유는 무엇입니까? echo "x 축" | sed 's/x\s*/x /'

x하나를 찾아서 다음 0개 이상의 공백( \s*)을 하나의 공백으로 바꾸고 싶습니다 .

echo "x ax" | sed 's/x\s*/x /'

어떤 이유로 공백을 단일 공백으로 바꾸는 대신 이전에 존재했던 여러 공백에 공백을 추가합니다.

x  ax

플래그를 어떻게 사용하든 +대신 사용하는 것은 전혀 의미가 없는 것 같습니다.*-E

sed탐욕스럽지 않은 표현을 수행하지 않는 것 같은데 왜 *일치시 공백을 모두 소모하지 않습니까?

나는 bash가 아닌 설정의 정규식 닌자이지만 bash와 그 도구는 나를 산채로 먹습니다. 성공적인 검색 엔진 쿼리를 위해 이것을 어떻게 간결하게 표현해야 할지 모르겠습니다.

답변1

sed기대하다기본 정규식(갈아 바수다). \sBRE의 표준 특수 구조가 아닙니다.오히려, 그 문제에 대해서는) 이는 일부 언어, 특히 Perl(다른 많은 언어가 이를 모방함)의 확장입니다. sed에서 구현에 따라 \s리터럴 문자열 \s또는 리터럴 문자를 나타냅니다 s.

구현에서는 \smatch 처럼 보이 s므로 \s*0 이상과 일치 s하고 예제 입력에서는 match x\s*이므로 로 변환됩니다(등으로 변환됩니다). 다른 구현(예: GNU sed 사용)에서는 match 이므로 일치 항목 뒤에 0개 이상의 백슬래시가 옵니다. 이는 입력에 표시되지 않으므로 행은 변경되지 않습니다.xx axx axxyx y\s\s\s*s

이것은 탐욕과 관련이 없습니다. 탐욕은 문자열이 정규식과 일치하는지 여부에 영향을 주지 않으며 일치 항목에서 캡처되는 문자열 부분에만 영향을 미칩니다.

답변2

나는 당신이 sed와 grep 플래그를 혼동하고 있다고 생각합니다. -E는 정규식을 확장하는 grep 플래그입니다. -r은 확장 정규식의 sed 플래그입니다. 다음은 나에게 효과적이었습니다.

echo "x     ax" | sed -r 's/x\s*/x /'

그것은 생산한다

x ax

관련 정보