web-dev-qa-db-ja.com

文字列から最後の文字を削除するにはどうすればよいですか?

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

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

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

必要な出力はtype_cardioです。

9
Rak kundra

varの最後の_の後からすべてを削除し、その結果をvar2に割り当てるには:

var2=${var%_*}

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

POSIX標準では、これを "Remove Smallest Suffix Pattern" パラメータ展開と呼んでいます。

最後の下線とその後の10文字を削除するには、次を使用します。

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

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

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

使用するパターンは、マッチをどの程度注意深く実行したいかによって異なります。

17
Kusalananda

文字列から末尾の11文字を実際に削除する必要があります。これを行う別の方法を次に示します。

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

bashの別のアプローチ:

echo "${var::-10}"

または古いバージョンでは:

echo "${var::${#var}-10}" #or
echo "${var: : -10}"
6
αғsнιη

1)bashソリューション:

var1="type_cardio_10-11-2017"
var2=${var1%_*}

2)カットソリューション:

var1="type_cardio_10-11-2017"
var2=$(cut -d'_' -f1,2 <<<"$var1")
echo "$var2"

出力:

type_cardio
4
RomanPerekhrest

varと_var2_を追加するのは簡単な部分です-_new_var="$var$var2"_のようにそれらを結合するだけです。 本当に言うつもりならstoreを切り抜いてvarを_var2_に切り取れば、それはvar2=$(...)だけですそして、他のユーザーと私の回答がここで提示したコマンドを$()部分に入れることができます。

主な部分は、それらの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
    _
1