예를 들어 다음과 같은 경우가 있다고 가정해 보겠습니다.
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]/
부울로 평가되도록 의도된 것입니다(즉, 문자 a
thru 를 포함 합니까 z
).tr/a-z//
숫자a
범위의 문자 수 z
. (0보다 큰 숫자를 반환하는 경우 소문자(예: $_ = lc
) 는아니요발생하다. )
어느 것이 더 낫습니까? 아직 벤치마킹해본 적은 없지만, 그 차이는 아마 작을 것이므로, 좀 더 익숙한 것을 사용하는 것이 가장 좋습니다.
하지만 기억하세요: 이 m/[a-z]/
메서드는 [
및 ]
대괄호를 사용하는 반면, 이 메서드는 두 개의 s로 연속해서 끝나지 tr/a-z//
않습니다 . /
둘 다 기억하는 것은 다소 번거로울 수 있으므로 기억하기 쉬운 것을 사용하는 것이 좋습니다.