文字列から最後の文字を削除する方法は?

文字列から最後の文字を削除する方法は?

変数がに設定されていますvar='type_cardio_10-11-2017'。変数から最後の10文字を削除し、残りの値をに追加する必要がありますvar2

次のスクリプトを試しましたが、期待どおりに動作しません。

var=type_cardio_10-11-2017
var2=${var} | cut -f1 -d "_"
echo ${var2}

私が望む出力はハート型

答え1

最後のもの以降のすべてを削除し_var結果を次に割り当てるには、次のようにしますvar2

var2=${var%_*}

パラメータ拡張は、指定された変数値の末尾から${parameter%word}パターンを削除しますword(この場合)。_*

POSIX標準はこれを呼び出します。「最小サフィックスパターンの削除」パラメータ拡張。

最後のアンダースコアとその後の10文字を削除するには、次のようにします。

var2=${var%_??????????}

日付文字列に対応する文字(例の文字など)を削除するには、次のようにします。

var2=${var%_[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]}

使用するモードは、一致をどれだけ慎重に実行するかによって異なります。

答え2

実際に末尾を削除したいです。11文字列の文字は次のとおりです。

$ var=type_cardio_10-11-2017
$ var2=${var%???????????}
$ echo "$var2"
type_cardio

答え3

別の方法bash

echo "${var::-10}"

または以前のバージョンでは:

echo "${var::${#var}-10}" #or
echo "${var: : -10}"

答え4

合計を追加するのは簡単な部分varです。var2このように組み合わせることができますnew_var="$var$var2"。場合は本物あなたが欲しいという意味です。お店varに切り捨てると、他のユーザーがここに示したコマンドと私の答えをそのセクションに入れることができますvar2var2=$(...)$()

主な部分は、この10文字を削除することです。必要な部分を抽出する方法はいくつかありますvar

  • printf(移植性に優れ、特定のシェルに依存しない)

    $ printf "%.11s\n"  "$var"                                                                                                                                                                      
    type_cardio
    
  • awk

    $ var=type_cardio_10-11-2017                                                                                                                                                                    
    $ awk -v awk_var="$var"  'BEGIN{print substr(awk_var,0,length(awk_var)-11)}'                                                                                                                    
    type_cardio
    

    または、printfここでトリックを使用することもできます。

    $ echo "$var" | awk '{printf "%.11s\n",$0}'                                                                                                                                                     
    type_cardio
    
  • egrep

    $ echo "$var" | egrep  -o '^.{0,11}'                                                                                                                                                           
    type_cardio
    
  • perl:

    $ echo "$var" | perl -lne 'print substr($_,0,11)'                                                                                                                                               
    type_cardio
    
  • python:

    $ python -c 'import sys;print sys.argv[1][0:11] ' "$var"                                                                                                                                        
    type_cardio
    

関連情報