- ベストアンサー
bashで変数の文字列を編集する方法
- bashで変数の文字列を編集する方法について教えてください。
- 指定の変数から文字列を編集する手順を知りたいです。
- 変数の値から特定の文字列を取り出す方法を教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
極端な話、bash以外のプログラムの助けを借りていいのなら、なんでもできます。 バッククオート``でコマンドを実行すればいいのですから。 Cなりなんなりで 指定日付の前日を表示するcalcDaysBeforeとかコマンドを作成して Test2='2010-03-01' Test2x=`calcDayBefere "${Test2}"` echo $Test2x とするとか。 GNUのdateだと、任意の日付を任意のフォーマットで出力できるので Test2='2010-03-01' Test2x=`date -d "${Test2} -1 days" +'%Y-%m-%d'` echo $Test2x とできます。他のdateコマンドでは使えません。
その他の回答 (3)
- Tacosan
- ベストアンサー率23% (3656/15482)
このくらいであれば「bash だけ」で終わらせることも可能です. 例えば 1: Test1x=${Test1%-*} Test1x=${Test1x/-} 3: Test3x=${Test3##*/} で (たぶん) 終わり. 2 もその気になればできるけど,努力と根性が必要なのでやろうとは思わない. フルパスからファイル名を除いた部分だけ欲しいなら ${foo%/*} が簡単. これだと最後のスラッシュが消えるので, 必要なら追加してやってください.
お礼
なるほど、有り難うございます。
- Tacosan
- ベストアンサー率23% (3656/15482)
どのような入力に対してどのような値を得たいのか, きちんと書いてもらえませんか? もちろん想像はできるにしても, その想像があなたの思っているものと一致するという保証はないですよね. あと, bash の他に使っていいコマンドは何があるんでしょうか? 「bash だけ」と限定すると cut や tr なども使えなくなりますよ. 余談だけど, Test2 と Test3 (あるいは Test2x と Test3x) は逆.
補足
>どのような入力に対してどのような値を得たいのか, きちんと書いてもらえませんか? 後は、文字列'2010-03-01'より、前日を求め、同じフォーマットの文字列で返すというのが残っています。
- P-mann
- ベストアンサー率62% (56/89)
Test2xはぱっと思いつかないけれど・・・。 Test1x=`echo ${Test1} | cut -d'-' -f1,2 | tr -d '-'` Test3x=`basename "${Test3}"`
お礼
有り難うございます。 cutを使いこなせば、多くの言語にありがちなsubstrやspritのような事が出来そうですね。 trはreplace的な動きでしょうか。 basenameは便利なコマンドですね。 逆にpathだけ抜き出すコマンドは無いのでしょうか? 教えていただいたコマンドを調べました。 cutとbasenameは下記のサイトに載っていましたが、trは載っていませんでした。 http://www.k4.dion.ne.jp/~mms/unix/linux_com/index.html コマンドを網羅できているWEBサイトがあれば教えてください。
お礼
>極端な話、bash以外のプログラムの助けを借りていいのなら、なんでもできます。 なるほど、つまりはこういう事ですか? 1.bashのプレーンな部分でできる事 2.linuxの環境を普通に作った範囲でbashから使用できる事 3.意図的に外部のアプリや開発アプリを組み込む事でできる事 を考えたとき、 1で出来ることは極限られているが、1~3で考えた時は、ほぼ何でもできる。 素人的には、1と2の境界線がよくわからないし、厳密に分かる必要もなく、 また、3は非常に敷居が高く、 1~2でできる事がbashでできる事という感覚です。 最初に紹介していただいたのが1~3でやる方法 後に紹介していただいたのが1~2でやる方法 でしょうか? 後者を試してみました。 うまく行きました。 これを元にTest1のパターンを試してみましたが、それもうまく行きました。 有り難うございます。 #!/bin/bash Test2='2010-03-01' Test2x=`date -d "${Test2} -1 days" +'%Y-%m-%d'` echo $Test2x Test1='2010-06-10' Test1x=`date -d "${Test1}" +'%Y%m'` echo $Test1x