이 정규식은 무엇을 대체합니까?
\([^:]*\):\(.*\)
답변1
이 정규 표현식은 일반적으로 /etc/passwd
파일에서 사용자 이름을 추출하는 데 사용됩니다. 예를 들어
sed 's/\([^:]*\):\(.*\)/\1/' /etc/passwd
비밀번호만을 기준으로 사용자 이름을 반환합니다 passwd
.
1st Capturing Group ([^:]*)
Match a single character not present in the list below [^:]*
* Quantifier — Matches between zero and unlimited times, as many times as possible, giving back as needed (greedy)
: matches the character : literally (case sensitive)
: matches the character : literally (case sensitive)
2nd Capturing Group (.*)
.* matches any character (except for line terminators)
* Quantifier — Matches between zero and unlimited times, as many times
요컨대.
첫 번째 부분:
sed 's/\([^:]*\):
/\([^:]*\): Match the string till you see a colon `:` and group.
두 번째 부분:
sed \(.*\)/\1/' /etc/passwd
\(.*\) Match everything after `:` and group
이제 2개의 그룹이 있으므로 이를 back-reference
사용 하여 \1
첫 번째 그룹을 참조하고 해당 결과를 인쇄하려고 함을 나타낼 수 있습니다.
답변2
이 정규식은 대체를 수행하지 않으며 컨텍스트가 없는 정규식일 뿐입니다.
완전한 명령을 알아야 합니다. 하지만 이 패턴이 적합하다고 가정할 수 있습니다.
(any symbol except : repeated zero or more times):(any symbol remeated zero or more times)
/etc/passwd
따라서 이 패턴을 사용하여 사용자 이름을 얻을 수 있습니다.
sed
옵션을 사용하여 -r
생략 할 수 ()
있으며 패턴이 가장 간단해집니다. 's//\1/'에 패턴을 삽입하세요.
sed -r 's/([^:]*):(.*)/\1/' /etc/passwd
출력은 다음과 같습니다:
root
daemon
bin
sys
sync
games
답변3
이렇게 하면 문자열의 첫 번째 콜론만 제거될 수 있습니다.
sed 's/\([^:]*\):\(.*\)/\1\2/' <<<"Hello:Unix:Users"
HelloUnix:Users
이는 \([^:]*\)
콜론이 아닐 때까지(또는 콜론이 표시되지 않을 때까지) 무엇이든 일치합니다.
그런 다음 ...\):\(...
해당 콜론을 일치시킵니다. 그리고 \(.*\)
그 이후의 모든 것. 그러나 \(..\)
사용되면 이는 sed
일치 항목 집합 및 해당 인덱스(또는 기본back-references
) 첫 번째 항목은 \1
이고 다음 항목 \2
은 입니다.
sed
교체 부분에 누가 이것을 사용하고 싶어하는지가 중요하기 때문에 아마도 첫 번째 콜론을 세미콜론으로 바꾸고 싶어할 수도 있다는 점을 언급했을 수도 있습니다 .
sed 's/\([^:]*\):\(.*\)/\1;\2/' <<<"Hello:Unix:Users"
아니면 다음 사이에 콜론 대신 다른 문자열을 추가하고 싶을 수도 있습니다.
sed 's/\([^:]*\):\(.*\)/\1 Linux and \2/' <<<"Hello:Unix:Users"
아니면 무엇이든 할 수 있고 교체할 수 있습니다 :)
답변4
이는 첫 번째 콜론 앞의 모든 것과 그 뒤의 모든 것을 캡처하는 기본 정규식(확장 정규식이 아님)입니다.
확장된 정규 표현식으로서, 입력의 괄호로 묶인 비트 자체에 괄호가 포함되어 있지 않다고 가정하여 콜론 앞에 괄호로 묶인 문자열을 일치시키고 콜론 뒤에 괄호로 묶인 다른 문자열을 일치시킵니다.
기본 정규식이라고 가정하면 입력에서 두 문자열을 캡처 first part
하고second part:third part
first part:second part:third part
\1
두 문자열은 \2
사용된 도구에 따라 다른 변수나 배열에서 사용할 수 있습니다.