텍스트 파일의 이름 목록에서 초기 이름을 축약합니다.

텍스트 파일의 이름 목록에서 초기 이름을 축약합니다.
Washington George
Adams John
Jefferson Thomas
Madison James

예상되는:

W. George
A. John
J. Thomas
M. James

sed나는 많은 Google 검색을 통해 사용한 몇 가지 패턴을 사용해 보았습니다 .

\<      # match start of word
\>      # match end of word

's/[^a-z]././'
's/.....\>/./'

처음 등장한 후 다음 단어까지 문자를 잡는 데 어려움을 겪고 있습니다.

답변1

다음 명령을 사용할 수 있습니다 sed.

$ sed 's/^\(.\)[^ ]*/\1./' file
W. George
A. John
J. Thomas
M. James

또는 더 간결하게 말하면:

$ sed -E 's/^(.)[^ ]*/\1./' file
W. George
A. John
J. Thomas
M. James

할 수 있는 작업:

  • 첫 번째 문자를 캡처합니다 ^(.).
  • 그런 다음 공백이 아닌 다음 문자를 선택합니다 [^ ]*.
  • 이전 패턴을 캡처된 문자 및 점으로 대체합니다.

\1첫 번째 캡처 그룹을 나타냅니다 : (.). 여러 번 캡처할 수 있으며 각 캡처는 \1첫 번째 캡처, \2두 번째 캡처 등 증분 숫자로 표시됩니다 . -E백슬래시 이스케이프 플래그 없이 패턴을 괄호로 둘러싸서 캡처를 수행합니다 .

답변2

첫 번째 소문자 세트를 점으로 바꾸려는 것 같습니다.

기본 정규식을 사용하여 소문자만 포함된 첫 번째 하위 문자열을 일치시키면 이를 수행할 수 있습니다.

$ sed 's/[[:lower:]]\{1,\}/./' file
W. George
A. John
J. Thomas
M. James

또한 sed이 옵션과 함께 사용하면 대부분의 구현에서 확장 정규식을 지원합니다 -E.

$ sed -E 's/[[:lower:]]+/./' file
W. George
A. John
J. Thomas
M. James

이렇게 하면 축약하려는 이름이 모두 대문자로 시작한다고 가정합니다. 다행히도 이런 상황은 흔한 일입니다.

답변3

Raku(이전 Perl_6) 사용

perl6 -pe 's/^^ (\w+) /{$0.comb[0]}./;' 

입력 예:

Washington George
Adams John
Jefferson Thomas
Madison James

예제 출력:

W. George
A. John
J. Thomas
M. James

간단히 말해서, 우리는 행의 시작 부분부터 일치를 s///요구하는 Raku의 대체 연산자를 사용하여 첫 번째 단어를 캡처 변수 에 캡처합니다 . 대체에서 Raku는 중괄호 안의 코드를 실행하라는 지시를 받습니다. 여기서 변수 -ing는 단일 문자로 캡처된 다음 첫 번째 문자가 사용되고 마지막으로 리터럴 마침표가 인쇄됩니다.^^\w+(…)$0{…}comb$0[0].

(물론) 단순히 문자를 캡처하여 대문자로 요구할 수도 있습니다.

raku -pe 's/^^ (<upper>) \w* /$0./;'

두 번째 예제 코드(위)는 OP의 예제 입력과 동일한 출력을 제공하지만 대문자로 표기하지 않은 이름(예: "de")을 변경하지 않고 그대로 두는 장점도 있습니다 de Gaulle Charles.

https://docs.raku.org/syntax/s$SOLIDUS$SOLIDUS$SOLIDUS
https://raku.org

관련 정보