정규식을 사용하여 쉘 변수 수정(bash)

정규식을 사용하여 쉘 변수 수정(bash)

예를 들어 쉘 변수가 있습니다. 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)은 대문자로 표시되었습니다( bashs보다 ${var^^pattern}수십 년 전).
  • (S)탐욕스럽지 않은 매칭을 켭니다.

관련 정보