출력에서 사용자 ID와 성의 첫 번째 이니셜을 추출합니다.

출력에서 사용자 ID와 성의 첫 번째 이니셜을 추출합니다.

사용자 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 joinlc소문자) 내에서 실행됨을 나타냅니다.

캡처에는 $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 "".

https://raku.org

관련 정보