첫 번째 영문자가 소문자인 경우 대문자로 변경

첫 번째 영문자가 소문자인 경우 대문자로 변경

영어 문장 목록이 포함된 Markdown 문서가 있습니다 myfile.md. 일부는 첫 글자가 소문자이고 일부는 대문자입니다.
모든 영어 문장은 표준 영어 문자로 시작하며 특수 문자는 사용되지 않습니다.

x
x
x

이 논리를 따르는 함수가 필요합니다.
첫 번째 영문자가 소문자인 경우 대문자로 변경

따라서 파일을 다음과 같이 변경하십시오.

X X



내가 시도한 것

1)tr

tr정규식을 사용하여 이를 수행하고 싶지만 파일에서 정규식을 결합하는 방법 이나 파일 내의 데이터로 작업하는 방법을 'tr '[:lower:]' '[:upper:]' myfile.md 찾지 못했습니다 . 대신 다음과 같이 쉘 프롬프트에서 텍스트를 변환하는 방법을 찾았습니다.trtr

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

\UGNU sed의 기능을 사용하십시오 .

 s/^\([a-z]\)/\U\1/

따라서 줄 시작 부분에 있는 단일 문자는 문자가 소문자인 경우 캡처되고 문자가 대문자인 경우 해당 문자가 캡처됩니다.

\U는 다른 것에 관심이 없기 때문에 다음과 같이 단순화됩니다.

s/\(.\)/\U\1/

.줄의 첫 번째 문자(있는 경우)가 일치하기 때문입니다 .

답변2

tr여기서는 대문자가 tr될 것이기 때문에 도움이 되지 않습니다.모두문자는 대문자로 변환됩니다( tr문자 컨텍스트는 한 번만 있으므로 "줄의 시작" 또는 "단어의 시작"을 알 수 없습니다).

sedGNU를 사용하면 가능합니다 sed. 그러나 표시하는 방식에 따라 첫 번째 대문자가 리터럴 텍스트로 대체됩니다 [A-Z].


이 질문에 태그가 추가되었으므로awk, 다음은 모든 줄의 첫 번째 문자를 대문자로 표시하는 표준 준수 솔루션입니다 .

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

줄에서 공백이 아닌 첫 번째 문자를 대문자로 표시하려면(문자인 경우) 이 변형을 사용하세요.코살로난다의 답변:

awk '{ ch = substr($1,1,1); uch = toupper(ch); if (ch != uch) sub(ch, uch); print }'

이는 공간을 파괴하지 않는다는 점에 유의하십시오.


줄의 첫 글자를 대문자로 표시하려면 이 변형을 사용하세요.이카루스의 대답:

sed 's/\([a-z]\)/\U\1/'

즉, 생략합니다 ^.

답변4

POSIX sed:

h
s/(.).*/\1/
y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
G
s/(.)\n.?(.*)/\1\2/

관련 정보