
다음과 같은 입력이 있습니다.
Austin, Ashley D
Bender, Isaiah J
여기서는 ","까지 이름을 잘라낸 다음 두 번째 이름의 첫 글자를 추가하려고 합니다.
예를 들어 위의 두 사람은 Austina와 Benderi가 될 것입니다. 누구든지 도와주세요.
답변1
당신은 이 문제를 으로 해결하는 데 관심을 표명했습니다 cut
. 그것을 할 수있는 방법이 있어야합니다파이프그리고 어떤 조합cut
,tr
, 그리고 (아마도)paste
. 그러나 특히 이니셜의 대소문자를 수정하므로(예: Ashley의 앞에 있는 "A"가 "Austina"의 뒤에 오는 "a"가 됨) .보다 더 다양한 기능을 사용하는 것이 더 쉽습니다 cut
. 나는 제안한다Perl 한 줄짜리, 주로 이름에 허용하려는 문자에 따라 다음과 같을 수도 있습니다.
perl -wpe 's/^(\w+),\s*(\w).*/$1\L$2/' file
-w
이는 경고를 활성화하고( ), 입력을 한 줄씩 읽고, 각 줄에서 스크립트를 실행하고 결과를 인쇄하고( -p
), 다음 명령줄 인수에서 스크립트를 가져오는 Perl 인터프리터를 실행합니다 ( -e
). 스크립트 자체, s/^(\w+),\s*(\w).*/$1\L$2/
내가인용하다~와 함께작은따옴표그래서 쉘은 자체적으로 수행하지 않습니다확장그 위에는 입력과 일치하는 표현식으로 구성됩니다.s/pattern/replacement/
무늬일치 항목을 다음으로 대체합니다.대사.
에서정규식, ^(\w+),\s*(\w).*
:
^
줄의 시작과 일치합니다.(\w+)
하나 이상과 일치합니다(+
) 단어 문자(\w
, 아래 참조), 이를 캡처합니다((
)
)를 첫 번째 캡처 그룹에 넣습니다.,
문자 그대로 일치합니다.\s*
0개 이상 일치(*
) 공백 문자(\s
).(\w)
정확히 한 단어 문자와 일치합니다(\w
, 아래 참조), 이를 캡처합니다((
)
)을 두 번째 캡처 그룹에 넣습니다..*
0개 이상 일치(*
) 한 줄에 나타날 수 있는 모든 문자(.
). 즉, 나머지 줄과 일치합니다.
그런 다음 $1\L$2
일치하는 모든 텍스트(전체 줄을 가정)를 발생시킵니다.했다일치)는 다음으로 대체됩니다.
$1
, 수정 없이 첫 번째 캡처 그룹의 내용입니다. 이것은 개인의 성을 포함하기 위한 필드입니다.\L$2
, 두 번째 캡처 그룹( )의 내용을$2
소문자로 변환합니다(\L
). 이는 사람의 이름을 포함하도록 의도된 첫 번째 문자입니다(그러나 소문자로 사용됨).
그것은 있는 그대로 당신에게 효과적일 수 있습니다. 하지만:
\w
이름에서 일치시키려는 문자에 따라 패턴에서 두 가지 항목을 모두 수정해야 할 수도 있습니다 .\w
문자, 숫자, 밑줄(_
)만 일치합니다. 많은 이름에는 대시나 아포스트로피 등 이 문자 외에 다른 문자가 있습니다.- 편지의 자격이 무엇인지에 대한 문제도 있습니다(때때로 다른 솔루션이 있지만 더 간단한 도구에도 적용됨). 보다정규식에서 문자만 일치시키는 가장 좋은 방법은 무엇입니까?이는 악센트 문자, 문자에 첨부된 발음 구별 부호 및 비라틴어 알파벳 문자가 포함된 이름과 관련이 있습니다.
- 대소문자 변환은 보기보다 어려운 문제입니다. 서로 다른 서면 언어에는 서로 다른 글자가 있을 뿐만 아니라 동일한 글자 중 일부에 대해 대소문자 변환도 다릅니다.
다른 하나는 매우단순한그 대신에 선택을 \w
할 수 있습니다. 이름에 무엇이든 포함할 수 있도록 허용하는 것입니다.다른공백 또는 ,
--는 각각 \w
을 [^,\S]
. 만들기[
]
캐릭터 클래스, 선행은 ^
클래스에 모든 항목이 포함되어 있음을 의미합니다.하지만지정된 문자(즉~ 아니다문자 클래스 외부의 의미와 관련), ,
문자 그대로 자신을 지정합니다.\s
모든 공백 문자를 지정합니다.
perl -wpe 's/^([^,\s]+),\s*([^,\s]).*/$1\L$2/' file
Perl의 정규식에 대한 자세한 내용은 다음을 참조하세요.perldoc perlretut
그리고perldoc perlre
. 당신이 제시한 문제는단지기본 텍스트 처리 도구보다 더 정교한(따라서 더 복잡한) 도구를 사용하도록 동기를 부여할 만큼 복잡합니다. 아마도 이러한 도구를 사용하여 이를 수행할 수 있는 방법을 찾을 수 있으므로 그렇게 한다고 해서 나는 확실히 당신을 비난하지 않습니다! 그러나 나는 이것이 미래의 훨씬 더 복잡한 문제에 여전히 도움이 될 수 있다고 생각합니다.
답변2
컷, 파이프, tr, 페이스트 및 sed를 사용하여 제안된 솔루션은 다음과 같습니다.
cut -f1 -d, foo >bar; cut -f2 -d" " foo | cut -c1 |tr "A-Z" "a-z" >bar2 ;paste bar bar2|sed -e "s/\x9//g"
foo는 입력 내용이 포함된 파일입니다. 그래서 컷 등으로 작업을 관리할 수 있지만 펄 솔루션이 더 우아하고 적절합니다.