x
하나를 찾아서 다음 0개 이상의 공백( \s*
)을 하나의 공백으로 바꾸고 싶습니다 .
echo "x ax" | sed 's/x\s*/x /'
어떤 이유로 공백을 단일 공백으로 바꾸는 대신 이전에 존재했던 여러 공백에 공백을 추가합니다.
x ax
플래그를 어떻게 사용하든 +
대신 사용하는 것은 전혀 의미가 없는 것 같습니다.*
-E
sed
탐욕스럽지 않은 표현을 수행하지 않는 것 같은데 왜 *
일치시 공백을 모두 소모하지 않습니까?
나는 bash가 아닌 설정의 정규식 닌자이지만 bash와 그 도구는 나를 산채로 먹습니다. 성공적인 검색 엔진 쿼리를 위해 이것을 어떻게 간결하게 표현해야 할지 모르겠습니다.
답변1
sed
기대하다기본 정규식(갈아 바수다). \s
BRE의 표준 특수 구조가 아닙니다.오히려, 그 문제에 대해서는) 이는 일부 언어, 특히 Perl(다른 많은 언어가 이를 모방함)의 확장입니다. sed에서 구현에 따라 \s
리터럴 문자열 \s
또는 리터럴 문자를 나타냅니다 s
.
구현에서는 \s
match 처럼 보이 s
므로 \s*
0 이상과 일치 s
하고 예제 입력에서는 match x\s*
이므로 로 변환됩니다(등으로 변환됩니다). 다른 구현(예: GNU sed 사용)에서는 match 이므로 일치 항목 뒤에 0개 이상의 백슬래시가 옵니다. 이는 입력에 표시되지 않으므로 행은 변경되지 않습니다.x
x ax
x ax
xy
x y
\s
\s
\s*
s
이것은 탐욕과 관련이 없습니다. 탐욕은 문자열이 정규식과 일치하는지 여부에 영향을 주지 않으며 일치 항목에서 캡처되는 문자열 부분에만 영향을 미칩니다.
답변2
나는 당신이 sed와 grep 플래그를 혼동하고 있다고 생각합니다. -E는 정규식을 확장하는 grep 플래그입니다. -r은 확장 정규식의 sed 플래그입니다. 다음은 나에게 효과적이었습니다.
echo "x ax" | sed -r 's/x\s*/x /'
그것은 생산한다
x ax