Unix에서 다음 명령의 기능을 이해할 수 없습니다.
sed 's/^*//g'
나는 성공하지 않고 Google에서 검색을 시도했습니다. 어떤 도움이라도 대단히 감사하겠습니다.
답변1
주어진 명령은 sed
각 입력 줄의 시작 부분에서 단일 문자를 제거하려고 시도합니다.*
이 sed
유틸리티는 일반적으로 파일이나 데이터 스트림의 한 줄씩 텍스트 수정에 사용됩니다. 명령줄에 파일 이름 피연산자가 제공되지 않으므로 질문의 명령은 표준 입력 스트림을 편집합니다. 이는 입력의 각 행에 편집 표현식을 적용합니다 s/^*//g
. 이는 정규 표현식과 일치하는 모든 항목을 제거하는 대체 명령입니다 ^*
(또는 오히려 동일한 효과를 갖는 아무것도 대체하지 않습니다).
표현식의 첫 번째 문자는 ^
표현식이 행의 시작 부분에서 일치하도록 강제하는 "앵커"입니다. 이 *
문자는 일반적으로 정규 표현식에서 "특수" 문자입니다(이전 표현식이 0번 이상 일치하도록 허용합니다. 예를 들어 ab*
와 일치합니다 a
등 ab
) abb
. 그러나 *
첫 번째 문자(아마도 초기 ^
앵커 다음)인 경우 리터럴 문자와 일치합니다 *
.
이는 POSIX에도 해당됩니다.기초적인sed
(및 ) 이 기본적으로 사용하는 정규식입니다 grep
. sed
POSIX를 지원할 수도 있습니다 .연장하다*
첫 번째(또는 바로 다음 ^
)가 다음인 정규식명확하지 않다오류가 발생할 수 있습니다.
$ 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
보시다시피 이는 샘플 데이터의 두 번째 및 세 번째 행에 영향을 미칩니다.