web-dev-qa-db-ja.com

bashでヌメロニムを作成する方法

与えられたWordをその数字に変えるコードを書こうとしています。

例:国際化= i18n(最初の文字+間の文字数+最後の文字)

最初と最後の文字を見つける方法と数字の部分を見つける方法はわかりましたが、最初と最後の文字の間に数字を入れる方法がわかりません。

数値部分を取得するために使用したコードは次のとおりです。

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

最初と最後のchacarterを取得するために使用したコード:

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

別の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文字を出力します。
10
jesse_b

Ksh93では、bashまたはzsh:

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

これは、最初の文字(文字数から2を引いたもの)、および最後の文字を印刷することにより、最初の(のみ)パラメーターで機能します。

15
Jeff Schaller

多くのシェルに移植可能:

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
5
Isaac