주어진:
main_east_library
main_west_roof
main_north_roof
minor_south_roof
내가 사용하는 수있는 방법 sed
(특히,하지 awk
, tr
등) 만들 수 있습니다 :
main_east_Library
main_west_Roof
main_north_Roof
minor_south_Roof
다음과 같은 것 :
$ echo "main_west_library
main_west_roof
main_north_roof
minor_south_roof" | sed 's_\3_upcase(\3)_'
비록 그것이 준다 :
sed: -e expression #1, char 16: Invalid back reference
답변
GNU로 sed
:
sed -E 's/[[:alpha:]]+/\u&/3'
각 줄에서 세 번째 문자 시퀀스를 대문자로 표시하십시오.
활용하려면 모든 각 라인에서 문자의 세 번째 순서를 :
sed -E 's/(([[:alpha:]]+[^[:alpha:]]+){2})([[:alpha:]]+)/\1\u\3/g'
GNU 를 사용하여 전체 입력에서 세 번째 문자 시퀀스를 모두 대문자로 표시하려면 awk
다음을 수행하십시오.
awk -v RS='[^[:alpha:]]+' -v ORS= '
NR % 3 == 0 {$0=toupper(substr($0,1,1)) substr($0,2)}
{print $0 RT}'
또는과 perl
:
perl -Mopen=locale -pe 's/\p{alpha}+/++$n % 3 == 0 ? "\u$&" : "$&"/ge'
그동안 [[:alpha:]]
문자 클래스는 일부 시스템에 약간의 랜덤 수 (GNU 시스템의 예를 들어, 즉 아라비아 사람 (0123456789)의 배제 많은 숫자 포함), 펄은 \p{...}
유니 코드 문자 속성을 기반으로합니다. 따라서 \p{alpha}
모든 알파벳의 문자와 문자가 아닌 알파벳 문자가 포함됩니다.
분음 부호를 결합하는 것은 포함되지 않지만 같은 단어 Stéphane
는 두 개의 개별 단어로 간주됩니다.
따라서 대신 원할 수도 있습니다.
perl -Mopen=locale -pe 's/[\p{alpha}\p{mark}]+/++$n % 3 == 0 ? "\u$&" : "$&"/ge'
너무 많은 것을 포함하여 끝날 수 있습니다.
또한 GNU에 그 반대로주의 sed
, 펄은 \u
정확하게 같은 단어를 변형시킬 것이다 fiddle
(여기서 fi
하나 개의 합자 문자가) Fiddle
(2 자 F
와 i
).
답변
펄
perl -pe 's/(?:.*?_){2}\K./\u$&/'
밑줄로 끝나는 2 개의 문자 시퀀스를 계산 한 후 다음 문자를 대문자로 표시합니다.
답변
또 다른 GNU sed
:
sed -E 's/([^[:alpha:]])([[:alpha:]])/\1\u\2/2'
이것은 줄이 항상 단어로 시작한다고 가정합니다.