예를 들어 쉘 변수가 있습니다. a = "큰 작은 남자". bash에서 정규식을 사용하여 대문자로 된 중간 단어만 사용하여 변수를 인쇄하는 방법은 무엇입니까? (어른과 악당)
변수를 3개의 변수로 분할한 다음 에코에서 확장하면 됩니다. 예를 들어 first=${a%* }
등. 하지만 정규식을 사용하여 한 번에 어떻게 할 수 있습니까?
한줄로 가능한가요? 대문자 연산자(^)를 사용하세요.
답변1
sed
GNU sed를 사용한다고 가정합니다.
$ sed -E 's/(\w+) (\w+) (\w+)/\1 \U\2\E \3/' <<< 'big little man'
big LITTLE man
이 명령은 다음을 사용합니다.GNU 특정 시퀀스 \U
\E
후속 문자를 각각 대문자로 변환하고 대소 문자 변환을 취소합니다 .
앗
정규식에서는 작동하지 않지만 awk
개별 단어를 대문자로 표시하는 또 다른 편리한 방법을 제공합니다.
$ awk '{print($1, toupper($2), $3)}' <<< 'big little man'
big LITTLE man
세게 때리다
Bash에는 기본적으로 정규식 기반 변환이 없지만 문자열을 배열로 처리하여 부분 대문자를 얻을 수 있습니다.
$ (read -a words; echo "${words[0]} ${words[1]^^} ${words[2]}") <<< 'big little man'
big LITTLE man
이는 ^^
배열의 두 번째 요소(즉, 두 번째 단어)를 대문자로 변환합니다. 이 기능은 Bash 4에서 도입되었습니다.
답변2
필요에 따라 bash
다음 명령을 사용하여 한 줄로 이 작업을 수행합니다 ${variable^^}
.
$ a="big little man"
$ [[ "$a" =~ ^([^ ]+)\ ([^ ]+)\ (.*) ]] && a="${BASH_REMATCH[1]} ${BASH_REMATCH[2]^^} ${BASH_REMATCH[3]}"
$ echo "$a"
big LITTLE man
이는 정규식을 ([^ ]+)\ ([^ ]+)\ (.*)
의 문자열과 일치시킵니다 $a
. 일치하는 항목이 있으면 공백으로 구분된 세 개의 하위 문자열이 포함됩니다. 첫 번째 및 두 번째 하위 문자열은 공백을 포함하지 않는 문자열이고, 세 번째 하위 문자열은 문자열의 나머지 비트입니다.
표현식이 일치하면 $a
값은 대문자의 두 번째 하위 문자열로 덮어쓰여집니다.
이는 원래 문자열이 공백이 아닌 문자로 시작한다고 가정합니다.
답변3
bash
스프레드 연산자를 사용하면 한 번에 이 작업을 수행 할 수 없다고 생각합니다 . zsh
다음을 사용할 수 있습니다 .
set -o extendedglob # for (#m)
b=${a/(#m) * /${(U)MATCH}}
또는:
b=${(S)a/(#b)(*) (*) (*)/$match[1] ${(U)match[2]} $match[3]}
어디:
(#m)
일치하는 문자열을 사용할 수 있게 합니다.$MATCH
(#b)
역참조 활성화${(U)var}
(또한$var:u
)은 대문자로 표시되었습니다(bash
s보다${var^^pattern}
수십 년 전).(S)
탐욕스럽지 않은 매칭을 켭니다.