Bash에서 숫자 기호를 만드는 방법

Bash에서 숫자 기호를 만드는 방법

주어진 단어를 숫자 이름으로 변환하는 코드를 작성하려고 합니다.

예: 국제화 = i18n(첫 번째 문자 + 중간 문자 수 + 마지막 문자)

첫 번째 문자와 마지막 문자 찾는 방법을 찾았고, 숫자 부분을 찾는 방법도 알지만, 첫 번째 문자와 마지막 문자 사이에 숫자를 넣는 방법을 모르겠습니다.

숫자 부분을 얻는 데 사용하는 코드는 다음과 같습니다.

cut -c 2- | rev | cut -c 2- | rev | tr -d [:space:]| wc -c 

첫 번째 문자와 마지막 문자를 가져오는 데 사용하는 코드는 다음과 같습니다.

awk -F "" '{print $1,$NF}'

답변1

빈 필드 구분 기호를 사용하는 것이 다소 "혁신적"이라고 생각하지만 awk가장 간단한 솔루션은 솔루션의 작은 확장일 뿐이라고 생각합니다.

awk -F "" '{print $1 (NF-2) $NF}'

물론 이것은 세 글자 이상의 단어에만 적용됩니다. 일반적인 상황 처리:

awk -F "" '{if (NF>2) print $1 (NF-2) $NF; else print $0}'

설명으로:

  • -F """$n 필드"를 사용하여 필드 구분 기호를 "null"로 설정표현 (함께N은 1부터 )까지의 필드 번호입니다 NF.그건 그렇고, GNU Awk 사용자 가이드에는 명확하게 명시되어 있습니다.이러한 사용 사례를 예시로 제공하세요., 그래서 빈 FS 사용에 대한 이전 우려를 수정했습니다. 그러나 매뉴얼에는 "이것은 일반적인 확장이며 POSIX 표준에 의해 지정되지 않습니다"라고 나와 있습니다.
  • if필드 수(즉, 여기의 문자 수)가 2보다 큰 경우 첫 번째 필드/문자( $1), 평가 표현식( NF-2)(첫 번째와 마지막 사이의 문자 수와 동일) 및 마지막 필드를 인쇄합니다. /문자( $NF). 여기서 사용된 호출 은 print개별 출력 토큰 사이에 공백을 생성하지 않습니다. 이는 인수가 공백 대신 쉼표로 구분된 경우에만 발생합니다(참조).예를 들어 GNU Awk 사용자 가이드).
  • else다음을 통해 액세스할 수 있는 전체 입력 표현식을 인쇄하면 됩니다.$0

실수로 두 글자를 입력했다면,예를 들어 at, 첫 번째 코드 예제의 경우 원치 않는(그러나 형식적으로는 올바른) 출력을 얻습니다 a0t(이 경우 첫 번째와 마지막 사이에 문자가 0이기 때문입니다).

또한 참고하시기 바랍니다, 이것은 중요합니다. 이 호출에 선행 또는 후행 공백이 포함된 문자열을 제공하면 awk(예: in ) echo " hello" | awk <etc.>해당 선행/후행 공백이 첫 번째/마지막 문자로 처리되어 원치 않는 동작이 발생합니다!

답변2

ksh93, bash 또는 zsh:

numeronym() {
  (( ${#1} > 2 )) || return
  printf '%s%d%s\n' "${1:0:1}" "$(( ${#1} - 2 ))" "${1: -1:1}"
}

이는 첫 번째 문자(문자 수 - 2)와 마지막 문자를 인쇄하여 첫 번째(유일한) 인수를 처리합니다.

답변3

또 다른 awk 솔루션:

awk '{l=length($1); print substr($1,1,1) l-2 substr($1,l,1)}'
  • l=length($1)- l변수를 문자열 길이로 설정합니다(입력 문자열이 첫 번째 열에 있고 공백을 포함하지 않는다고 가정).
  • substr($1,1,1)- (열 번호, 시작 지점, 끝 지점) 따라서 위치 1에서 시작하여 열 1을 인쇄하고 1자를 인쇄합니다.
  • l-2- 문자열 길이를 2만큼 줄입니다.
  • substr($1,l,1)- l위치(문자열 길이)부터 시작하여 열 1을 인쇄하고 1자를 인쇄합니다.

답변4

많은 쉘에 이식 가능:

a=internationalization;
if [ "${#a}" -gt 2 ]; then 
    a="${a%"${a#?}"}$((${#a}-2))${a#"${a%?}"}";
fi
printf '%s\n' "${a}"

기능적으로 (약간 덜 이식성):

numeronym() {  a="$1";
               if [ "${#1}" -gt 2 ]; then 
                    a="${a%"${a#?}"}$((${#a}-2))${a#"${a%?}"}";
               fi;
               printf '%s\n' "${a}";
            }

불러라:

$ numeronym internationalization
i18n

awk여야 하는 경우:

$ echo internationalization |
      awk '{ print (NF>2) ? $1 NF-2 $NF : $0 }' FS=''

i18n

관련 정보