사용자 ID의 출력을 얻으려면 getent passwd를 사용하십시오.
출력을 어떻게 변경할 수 있나요?
u12345:John Doe
도착하다
u12345,jdoe
나는 그것을 얻기 위해 sed를 사용했지만 u12345를 제거했지만 jdoe를주었습니다.
답변1
의 경우 awk
가정 :
및 공백을 필드 구분 기호로 안정적으로 사용할 수 있습니다.
$ echo 'u12345:John Doe' | awk -F'[: ]' '{print $1 "," tolower(substr($2, 1, 1) $3)}'
u12345,jdoe
답변2
그리고 Perl
:
perl -lne 'print "$1," . lc $2 . $3 if /^([^:]+):(\w)\S+\s+(\S+)/' file
u12345,jdoe
답변3
GNU 사용 sed
:
sed -nE 's/^([^:]*):([^:[:space:]])[^[:space:]]*[[:space:]]+([^:[:space:]]+).*$/\1,\L\2\3/p'
또는 다음을 사용하십시오 perl
.
perl -C -F: -lae 'print "$F[0]," . lc("$1$2") if $F[1] =~ /^(\S)\S*\s+(\S+)/'
답변4
사용행복하다(이전 Perl_6)
~$ raku -ne 'put "$0,{($1,$2).join.lc}" if m/^ (<-[:]>+) \: (\S) \S* \s (\S+)/;' <<< 'u12345:John Doe'
예제 출력:
u12345,jdoe
Raku는 Perl 계열의 프로그래밍 언어입니다. 위에서 Raku 코드는 -ne
자동 인쇄가 아닌 라인별 플래그를 사용하여 실행되었습니다. 정규식 일치자는 m/ ... /
관심 라인을 식별하는 데 사용됩니다. ( if
) 와 일치하는 항목이 있는 경우 ( ... )
괄호로 캡처된 0 인덱스 그룹은 제외됩니다 put
. 중괄호는 Raku 코드가 (to join
및 lc
소문자) 내에서 실행됨을 나타냅니다.
캡처에는 $0
줄의 시작 부분부터 시작하는 문자가 포함되어 있습니다.원하지 않는다콜론이 포함되어 있습니다 :
. 즉, 두 개의 연속된 정규식 원자는 다음을 <-[:]> \:
의미합니다."콜론을 포함하지 않고 하나 이상의 이러한 문자를 찾은 다음 \:
콜론을 찾는 사용자 정의 문자 클래스를 만듭니다."
정규식 원자의 의미는 (\S) \S+ \s (\S+)
다음과 같습니다. " \S
공백이 아닌 문자 $1
(예: 이름의 첫 번째 문자)를 캡처하고, 공백이 뒤따르는 하나 이상의 비공백 문자를 식별한 후 \s
다음 과 (\S+)
같은 하나 이상의 공백이 아닌 문자 $2
(예: 단일(또는 이니셜) 이름과 단일 성의 가장 간단한 경우만 처리합니다.
참고: 위의 코드는 일치하지 않는 줄을 제거합니다. 일치하지 않는 행을 유지하려면 다음 코드를 사용하십시오.
~$ raku -ne 'if m/^ (<-[:]>+) \: (\S) \S* \s (\S+)/ {put "$0,{($1,$2).join.lc}"} else {put $_};' file
#OR
~$ raku -ne 'm/^ (<-[:]>+) \: (\S) \S* \s (\S+)/ ?? put "$0,{($1,$2).join.lc}" !! put $_;' file
일치하는 항목이 없으면 위 put $_
줄이 그대로 표시됩니다(줄은 $_
Perl/Raku "테마 변수"에 저장됩니다). 이 줄을 지우려면 "".put
또는 를 사용하십시오 put ""
.