대문자 줄만 소문자로 변환

대문자 줄만 소문자로 변환

예를 들어 다음과 같은 경우가 있다고 가정해 보겠습니다.

One, Two.
OnE, Two.
ONE, TWO.

모든 대문자 줄을 소문자로 바꾸고 싶으므로 다음과 같은 결과를 얻습니다.

One, Two.
OnE, Two.
one, two.

노력하고있어:

gsed '/[a-z]/!c\L&'

행과 정확하게 일치하지만 L&로 대체됩니다.

One, Two.
OnE, Two.
L&

어떻게 소문자로 변환할 수 있나요?

L 앞에 백슬래시를 2~3개 시도했지만 출력에만 표시됩니다.

더 나은 옵션이 있다면 awk나 tr 또는 다른 유틸리티를 사용하겠습니다.

또한 버전이 중요한 경우:

gsed --version
gsed (GNU sed) 4.9

답변1

POSIX awk를 사용하십시오.

$ awk '!/[[:lower:]]/ { $0=tolower($0) } 1' file
One, Two.
OnE, Two.
one, two.

답변2

작동하려면 for를 사용해야 한다고 생각합니다. 예를 들면 다음과 s///같습니다 .&

$ sed -e '/[a-z]/!s/.*/\L&/' < test.txt
One, Two.
OnE, Two.
one, two.

Perl을 사용하여 동일하거나 유사한 작업을 수행할 수 있습니다(GNU sed를 사용할 수 없는 경우 사용할 수 있음).

% perl -pe 's/.*/\L$&/ if not /[[:lower:]]/' < test.txt
One, Two.
OnE, Two.
one, two.

또는:

% perl -pe '$_ = lc if not /[[:lower:]]/' < test.txt
One, Two.
OnE, Two.
one, two.

답변3

그리고 Perl삼항 연산자:

$ perl -ne 'print /[a-z]/ ? $_ : lc' file
One, Two.
OnE, Two.
one, two.

설명하다

운영자 중요성
perl 실행 가능 파일
-n 우리가 사용하는 것처럼 현재 파일 내용을 구문 분석합니다.while (<>) ...
-e e표현
print 인쇄
/regex/ ? : 부울 결과를 기반으로 일치하는 삼항 연산자regex
/[a-z]/ 소문자 일치가 있는 경우...
$_ ...현재 줄의 현재 기본 변수를 인쇄합니다.$_
lc l...그렇지 않으면 현재 줄을 owese로 인쇄합니다 c(암시적으로 사용됨 $_).

답변4

내 (짧고 달콤한) Perl 솔루션은 다음과 같습니다.

perl -wpe '$_ = lc unless m/[a-z]/' file.txt

높은 수준의 설명: 이것은 다음과 같습니다: file 의 각 줄을 인쇄하기 전에 file.txt해당 줄을 소문자로 변환하세요.~하지 않는 한모두 소문자를 포함합니다.

다음과 같이 m/[a-z]/바꿀 수도 있습니다 .tr/a-z//

perl -wpe '$_ = lc unless tr/a-z//' file.txt

이들 사이의 차이점은 m/[a-z]/부울로 평가되도록 의도된 것입니다(즉, 문자 athru 를 포함 합니까 z).tr/a-z//숫자a범위의 문자 수 z. (0보다 큰 숫자를 반환하는 경우 소문자(예: $_ = lc) 는아니요발생하다. )

어느 것이 더 낫습니까? 아직 벤치마킹해본 적은 없지만, 그 차이는 아마 작을 것이므로, 좀 더 익숙한 것을 사용하는 것이 가장 좋습니다.

하지만 기억하세요: 이 m/[a-z]/메서드는 []대괄호를 사용하는 반면, 이 메서드는 두 개의 s로 연속해서 끝나지 tr/a-z//않습니다 . /둘 다 기억하는 것은 다소 번거로울 수 있으므로 기억하기 쉬운 것을 사용하는 것이 좋습니다.

관련 정보