sed-모든 세 번째 단어를 대문자로 쓰는 방법? sed(특히,하지 awk, tr등) 만들 수 있습니다

주어진:

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(여기서 하나 개의 합자 문자가) Fiddle(2 자 Fi).


답변

perl -pe 's/(?:.*?_){2}\K./\u$&/'

밑줄로 끝나는 2 개의 문자 시퀀스를 계산 한 후 다음 문자를 대문자로 표시합니다.


답변

또 다른 GNU sed:

sed -E 's/([^[:alpha:]])([[:alpha:]])/\1\u\2/2'

이것은 줄이 항상 단어로 시작한다고 가정합니다.