シェルスクリプトで文字列の区切り文字以降を取得する方法

このQ&Aのポイント
  • シェルスクリプトで文字列の区切り文字以降の文字列を取得する方法について質問しています。具体的には、文字列の右側にある特定の文字列を取り出したい場合について説明しています。
  • シェルスクリプトでaaa = bbbというような文字列からbbbを取り出す方法について質問しています。また、前後にスペースが入っていたり抜けていたりする場合についても言及しています。
  • シェルスクリプトでこのような文字列の処理ができるかどうかについて質問しています。perlではできたが、シェルスクリプトで完結させたいという希望も述べています。
回答を見る
  • ベストアンサー

シェルスクリプトで読み込んだ文字列の区切り文字以降の文字列を取得したい

ちょっと説明が難しいのですが aaa = bbb こういう文字列の右側のbbbを取り出したいのですが可能ですか? 全てこのようなら問題ないのですが、前後のスペースに問題があります _aaa = bbb や aaa=bbb aaa =__bbb アンダーバーはスペースのかわりです。 のように前後にスペースが1つ2つ入っていたり抜けていたりします。 aaa = bbb だったら i=`echo | sed 's/aaa\ =\ //'` のようにして取得できていますが、その他の処理がうまくできません そもそもシェルスクリプトでこのような処理は無理なのでしょうか? perl ではできたのですができればシェルスクリプトで完結させたいのです。 よろしくお願いします。 使っているシェルはzshです。

noname#71371
noname#71371

質問者が選んだベストアンサー

  • ベストアンサー
  • THX1138
  • ベストアンサー率51% (108/208)
回答No.1

前後の処理がよくわかりませんが、 挙げられている例を流用するのであればこんな感じです。 host$ echo ' aaa = bbb ' | sed -e 's/ *aaa *= *//' bbb host$ * は「1つ前にあるものの0回以上の繰り返し」を意味するので 上の例だと aaa の前と、= の前後であれば 何個スペースがあっても(0個でも)置換対象になります。 正規表現メモ http://www.kt.rim.or.jp/~kbk/regex/regex.html

noname#71371
質問者

お礼

ありがとうございました。 正規表現の*の使い方を間違えていたようでした。 助かりました。

関連するQ&A

  • シェルスクリプトについて

    シェルスクリプトを勉強しています。 hoge.txt内で"AAA"という文字列を"BBB"という文字列を検索し下記のような処理を行いたいです。  (1)AAA・BBBともにある場合  →スクリプトを続行  (2)AAA・BBBともにない場合  →スクリプトを停止  (3)AAAしかない場合  →BBBがありませんというメッセージを流す    (4)BBBしかない場合  →AAAなしでスクリプトを続行しますというメッセージを流す   シンプルなやり方でいいので上記のようなことを行いたい場合、どのようにスクリプトを書けばいいのか教えてください。 よろしくお願いします。

  • シェルスクリプトについて

    シェルスクリプトについて Linuxで先頭にスペースが入っている行をひとつ上の行につなげたいと考えています。 その場合、シェルスクリプトはどのように書けばよいかご教示願います。 【ファイル内容】 aaa △bbb ccc ddd (b行の先頭のみスペース(△)が入っています。) 【変換後のファイル】 aaa bbb ccc ddd

  • シェルスクリプトのBシェル(Bourne)に出てくる、$0,$1,$2

    シェルスクリプトのBシェル(Bourne)に出てくる、$0,$1,$2...のような位置パラメタや、$?,$$,$!,$-のような特殊変数がありますが、これはPerlやRubyもあるようですが、意味や効果、やり方等は同じでしょうか。 当方はPHP,JavaScriptしか触れていませんし、PHPやJavaScriptは、そのような位置パラメタや特殊変数は見当たりませんでした…。 つまり、PerlやRubyはUNIXのコマンドから誕生したスクリプト言語ということでしょうか。 こういった位置パラメタや特殊変数はPerlやRuby以外に他の言語にもありますでしょうか。PythonとかCとかJavaとか…。 また、Bシェルを学んでいる途中ですが、シェルスクリプトの中にはbourne以外にもbashやC Shell,zsh,Perlがありますが、何故Perlが入っているのでしょうか。 Perlをやっている方は別途シェルスクリプトをやる必要はないということでしょうか。

  • シェル関数引数のスペース文字列をgrepに

    下記のシェル関数 arg_space() 内で、grepを使いたいのですが。 'aaa bbb' などのスペースを含む文字列を引数として渡すとスペース後の文字列がファイル名と 認識されてしまいます。 -- arg_space.sh -- #!/bin/bash CHK_STR='aaa bbb' FILE_NAME='data/aaa.txt' function arg_space() { return `grep -c $1 $2` } arg_space $CHK_STR $FILE_NAME if [ $? -ge 1 ]; then echo 'Match !!' else echo 'No match.' fi exit 0 ------------------ ]# ./arg_space.sh grep: bbb: No such file or directory Match !! スペース文字を、grep に区切り文字として認識させないようにする 方法を教えて 頂けないでしょうか。 -- data/aaa.txt -- aaa bbb ccc ddd ---------------

  • シェルスクリプト

    よく回りの人が「シェルを叩く」と表現しているのですが 「シェルスクリプト」の中にJavaScriptは含まれているのでしょうか? とてもかけ離れてるイメージなのですが。 以下引用 複数の処理(コマンド)をまとめて行なうことのできるスクリプトである。スクリプトとは、機械語への変換作業を省略した簡易プログラムのことで、代表的なものにはPerlやVBScript、JavaScriptなどがある。また、シェルとは与えられた指示をOSの中核部分に伝えるソフトウェアのことである。

  • シェルスクリプトでのエラー時の処理について

    HTMLにシェルスクリプトを実行するSSIを埋め込んで、 その実行結果をHTML側に出力する、という処理をしようとしております。 大まかな処理内容は、指定の場所のファイルの有無をチェックして それにより"ok"か"ng"かの文字列をHTMLに出力する、というものです。 ====以下、HTMLソース(前後省略)==== <br> 結果は:<!--#exec cmd="./output.sh" --> <br> ====ここまで==== ====以下、シェルスクリプトソース==== #!/bin/sh CHECKFILE=/aaa/bbb/check.txt TEXTA=ok TEXTB=ng if [ -f $CHECKFILE ] ; then echo $TEXTA else echo $TEXTB fi exit ====ここまで==== この処理自体は特に問題無さそうなのですが、 この中に途中で異常終了した際のエラー処理を組み込むことによって、 異常時には固定で"ok"を出力して終了するようにしたいのです。 trap "echo 'ok'; exit" HUP INT QUIT KILL TERM や trap "echo 'ok'; exit" 1 2 3 9 15 などのtrapを入れたりもしたのですが、 思い通りには動かず、結果を返すことなく終了してしまいます。 このような場合、trapに限らず何か良い方法はありますでしょうか。 何かご存知の方おりましたらご助言頂けますでしょうか。。 よろしくお願いいたします。

  • 以降のスクリプトを実行せずに終わるシェルスクリプトの書き方

    Linux上で動かす以下のようなシェルスクリプトを作っています。 ▼------------------------------- if [ -d /home/aaa ]; then   処理1 else   処理2 fi 処理3 ▲------------------------------- この場合、/home/aaaが存在するかどうかに関わらず、 「処理3」は実行されてしまいます。 これを、 「/home/aaaが存在しない場合は処理2を行ってからスクリプトを終了する」 といった内容にしたいです。 現状はそれの書き方が見つからないので、処理1の次の行に処理3を書き込んで同じ結果にしています。 (そのためどんどんif文の階層が深くなり、全ての記述がif文の中に入っていく・・・) エクセルのVBAで言うところの、Exit Sub に該当する記述が理想的です。 そのような書き方がありましたら教えてください。

  • シェルスクリプト 引数の引渡しについて

    こんにちは。現在シェルスクリプトを勉強中なのですがどうしてもわからないことがあり投稿させていただきました。 シェルスクリプトにて作成した引数(引数にスペースがある場合)を別のシェルスクリプトへ渡そうとしたときにうまく引き渡せなくて困っています。 詳しくは以下のスクリプト参照願います。 (1)引数作成のスクリプト _/_/_/_/_/_/_/_/_/_/_/_/ #!/bin/sh a="HELLO" b="\"WOW WOW\"" test.sh $a $b _/_/_/_/_/_/_/_/_/_/_/_/ (2)test.sh _/_/_/_/_/_/_/_/_/_/_/_/ #!/bin/sh echo $1 echo $2 echo $3 _/_/_/_/_/_/_/_/_/_/_/_/ これを実行すると $1=HELLO $2="WOW $3=WOW" となってしまいます。 これを $1=HELLO $2=WOW WOW $3=NULL(空欄) となるようにシェルスクリプトで作成することはできないのでしょうか? ご教授よろしくお願いします。 よろしくお願いします。

  • ファイルから文字列を読み込むシェルスクリプトの作成

    現在シェルスクリプトの勉強をしています。 ファイルから文字列を読み込み表示するだけのシェルスクリプトを 作成しているのですが、エラーが出てうまくいきません。 ./test.sh: line 10: syntax error near unexpected token `done' 以下の通りファイルを作っています。 改行コードはLF、文字コードはSJISとなっています。 どのあたりが間違っているのか教えて頂けますでしょうか。 よろしくお願いします。 test.sh --------------------- #!/bin/sh LIST=./abc.lst while read F1 echo ${F2} break done < ${LIST} } --------------------- abc.lst --------------------- AAA BBB CCC ---------------------

  • シェルスクリプト間で排他をとりたい

    環境 linux(redhat) 使用シェル bash シェルスクリプトAとシェルスクリプトBを作成し、 シェルスクリプトAが動作している間は、シェルスクリプトBの動作を禁止したいと考えています。 例えば、シェルスクリプトAが起動している状態で、シェルスクリプトBが起動されたとき、シェルスクリプトBは、シェルスクリプトAが起動していることを検知して、自発的に処理を終了するようにしたいと考えています。 上記のような仕組みをシェルスクリプトで実現可能でしょうか? 基本的には、シェルスクリプトの先頭で、ある資源のロックを行い、終了時にロックの解放ができれば、その仕組みは実現可能と考えています。 (シェルの異常終了時は、ロックが自動的に解放されることが望ましい) 上記のようなことをシェル(bash)で実現可能でしょうか。 bash単独での方法、もしくはbashからperl,C言語作成の実行モジュールを呼び出す方法でもかまいません。 (ちなみにperl(もしくはC言語作成のモジュール)単独では実現可能なことはわかっています)