반면:
main_east_library
main_west_roof
main_north_roof
minor_south_roof
sed
(구체적으로 not 등) 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
답변1
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'
Perl의 문자 클래스는 유니코드 문자 속성을 기반으로 하지만 [[:alpha:]]
일부 시스템에서는 문자 클래스가 다소 무작위일 수 있습니다(예를 들어 GNU 시스템에서는 많은 숫자를 포함하지만 아라비아 숫자(0123456789)는 포함하지 않음). \p{...}
따라서 여기에는 \p{alpha}
알파벳의 모든 문자는 물론 알파벳이 아닌 알파벳 문자도 포함됩니다.
발음 구별 부호 결합은 포함되지 않지만 유사한 단어가 Stéphane
두 개의 별도 단어로 처리된다는 의미입니다.
따라서 다음을 수행할 수 있습니다.
perl -Mopen=locale -pe 's/[\p{alpha}\p{mark}]+/++$n % 3 == 0 ? "\u$&" : "$&"/ge'
하지만 이는 너무 많은 내용을 포함하게 될 수도 있습니다.
또한 GNU와 달리 Perl은 (where is 1 하이픈 문자)와 같은 단어를 (2 문자 and)로 sed
올바르게 변환합니다 .\u
fiddle
fi
Fiddle
F
i
답변2
진주
perl -pe 's/(?:.*?_){2}\K./\u$&/'
밑줄로 끝나는 일련의 2개 문자를 계산하고 다음 문자를 대문자로 표시합니다.
답변3
또 다른 GNU sed
:
sed -E 's/([^[:alpha:]])([[:alpha:]])/\1\u\2/2'
이는 줄이 항상 단어로 시작한다고 가정합니다.