sed 's/^*//g'는 무엇을 합니까?

sed 's/^*//g'는 무엇을 합니까?

Unix에서 다음 명령의 기능을 이해할 수 없습니다.

sed 's/^*//g'

나는 성공하지 않고 Google에서 검색을 시도했습니다. 어떤 도움이라도 대단히 감사하겠습니다.

답변1

주어진 명령은 sed각 입력 줄의 시작 부분에서 단일 문자를 제거하려고 시도합니다.*

sed유틸리티는 일반적으로 파일이나 데이터 스트림의 한 줄씩 텍스트 수정에 사용됩니다. 명령줄에 파일 이름 피연산자가 제공되지 않으므로 질문의 명령은 표준 입력 스트림을 편집합니다. 이는 입력의 각 행에 편집 표현식을 적용합니다 s/^*//g. 이는 정규 표현식과 일치하는 모든 항목을 제거하는 대체 명령입니다 ^*(또는 오히려 동일한 효과를 갖는 아무것도 대체하지 않습니다).

표현식의 첫 번째 문자는 ^표현식이 행의 시작 부분에서 일치하도록 강제하는 "앵커"입니다. 이 *문자는 일반적으로 정규 표현식에서 "특수" 문자입니다(이전 표현식이 0번 이상 일치하도록 허용합니다. 예를 들어 ab*와 일치합니다 aab) abb. 그러나 *첫 번째 문자(아마도 초기 ^앵커 다음)인 경우 리터럴 문자와 일치합니다 *.

이는 POSIX에도 해당됩니다.기초적인sed(및 ) 이 기본적으로 사용하는 정규식입니다 grep. sedPOSIX를 지원할 수도 있습니다 .연장하다*첫 번째(또는 바로 다음 ^)가 다음인 정규식명확하지 않다오류가 발생할 수 있습니다.

$ sed -E 's/^*//g'
sed: 1: "s/^*//g": RE error: repetition-operator operand invalid

결국 g아무것도 작동하지 않았습니다. 이 플래그는 "줄에서 겹치지 않는 모든 일치 항목에 대해 반복 교체"를 의미하지만 표현식이 줄의 시작 부분에 고정되어 있으므로 ^일치하는 항목은 많아야 하나입니다.

예:

$ printf '%s\n' 'a*a' 'bb*' '***' '*abc'
a*a
bb*
***
*abc

우리의 표현식은 위의 마지막 두 줄의 시작 부분에서 한 줄을 삭제할 sed것으로 예상됩니다 .*

$ printf '%s\n' 'a*a' 'bb*' '***' '*abc' | sed 's/^*//'
a*a
bb*
**
abc

g끝에 추가해도 아무런 차이가 없다는 것을 보여 드리겠습니다 .

$ printf '%s\n' 'a*a' 'bb*' '***' '*abc' | sed 's/^*//g'
a*a
bb*
**
abc

이 플래그는 앵커를 제거할 때까지 적용되지 않습니다 g.

$ printf '%s\n' 'a*a' 'bb*' '***' '*abc' | sed 's/*//g'
aa
bb

abc

이 특정 수정은 다음을 통해 보다 효율적으로 수행됩니다.

tr -d '*'

리터럴 문자는 기본 정규식에서 처음으로 일치하므로 *줄 끝 앵커를 사용하는 *식은 줄 끝에 있는 단일 문자와 일치합니다. 따라서 아래에서는 줄 끝의 문자를 제거하는 방법을 보여줍니다.*$$**

$ printf '%s\n' 'a*a' 'bb*' '***' '*abc' | sed 's/*$//'
a*a
bb
**
*abc

보시다시피 이는 샘플 데이터의 두 번째 및 세 번째 행에 영향을 미칩니다.

관련 정보