영어 문장 목록이 포함된 Markdown 문서가 있습니다 myfile.md
. 일부는 첫 글자가 소문자이고 일부는 대문자입니다.
모든 영어 문장은 표준 영어 문자로 시작하며 특수 문자는 사용되지 않습니다.
x
x
x
이 논리를 따르는 함수가 필요합니다.
첫 번째 영문자가 소문자인 경우 대문자로 변경
따라서 파일을 다음과 같이 변경하십시오.
X X
내가 시도한 것
1)tr
tr
정규식을 사용하여 이를 수행하고 싶지만 파일에서 정규식을 결합하는 방법 이나 파일 내의 데이터로 작업하는 방법을 'tr '[:lower:]' '[:upper:]' myfile.md
찾지 못했습니다 . 대신 다음과 같이 쉘 프롬프트에서 텍스트를 변환하는 방법을 찾았습니다.tr
tr
echo x | tr '[:lower:]' '[:upper:]'
엑스
2)sed
sed 's/^[a-z]*/[A-Z]/' myfile.md
sed -r 's/^[a-z]*/[A-Z]/' myfile.md
그러나 실행 후에도 myfile.md
여전히 포함됩니다.
x
x
x
대신에:
X X
내 질문
CLUI 텍스트 편집기(예: 또는 )를 사용하지 않고 nano
셸에 설명된 논리를 어떻게 사용할 수 있습니까 vim
?
답변1
\U
GNU sed의 기능을 사용하십시오 .
s/^\([a-z]\)/\U\1/
따라서 줄 시작 부분에 있는 단일 문자는 문자가 소문자인 경우 캡처되고 문자가 대문자인 경우 해당 문자가 캡처됩니다.
\U는 다른 것에 관심이 없기 때문에 다음과 같이 단순화됩니다.
s/\(.\)/\U\1/
.
줄의 첫 번째 문자(있는 경우)가 일치하기 때문입니다 .
답변2
tr
여기서는 대문자가 tr
될 것이기 때문에 도움이 되지 않습니다.모두문자는 대문자로 변환됩니다( tr
문자 컨텍스트는 한 번만 있으므로 "줄의 시작" 또는 "단어의 시작"을 알 수 없습니다).
sed
GNU를 사용하면 가능합니다 sed
. 그러나 표시하는 방식에 따라 첫 번째 대문자가 리터럴 텍스트로 대체됩니다 [A-Z]
.
이 질문에 태그가 추가되었으므로POSIXawk
, 다음은 모든 줄의 첫 번째 문자를 대문자로 표시하는 표준 준수 솔루션입니다 .
awk '{ ch = toupper(substr($0,1,1)); sub(".", ""); $0 = ch $0; print }' file
이 awk
명령이 수행하는 작업은 를 사용하여 줄의 첫 번째 문자를 추출하는 것입니다 substr()
. 그런 다음 대문자로 표시하고 변수에 할당합니다 ch
. 그런 다음 줄의 첫 번째 문자를 제거 sub()
하고 ch
줄 앞에 대문자를 추가합니다. 그런 다음 라인을 인쇄하십시오.
이것을 테스트해 보세요:
$ cat file
Apple
orange
grapefruit
Mango
$ awk '{ ch = toupper(substr($0,1,1)); sub(".", ""); $0 = ch $0; print }' file
Apple
Orange
Grapefruit
Mango
데이터에 들여쓰기가 있는 경우(즉, 줄 시작 부분에 공백이 있는 경우)
awk '{ ch = toupper(substr($1,1,1)); sub(".", "", $1); $1 = ch $1; print }' file
(그러나 이렇게 하면 들여쓰기가 제거됩니다.)
Perl을 사용하여 이 작업을 수행하려는 경우 다음 코드는 awk
위의 첫 번째 프로그램에서 수행하는 방식과 유사한 방식으로 각 줄의 첫 번째 문자를 대문자로 표시합니다.
perl -pe 'substr($_,0,1,uc(substr($_,0,1)))' file
사용하면서도
perl -pe 's/^./\U$&/' file
더 짧고 "Perl과 유사"합니다.
^.
이 표현식에서 [^[:blank:]]
줄의 공백이 아닌 첫 번째 문자를 다음으로 바꿉니다.구하다들여쓰기).
답변3
답변4
POSIX sed:
h
s/(.).*/\1/
y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
G
s/(.)\n.?(.*)/\1\2/