• 締切済み

正規表現の使い方

正規表現の使い方で困っています。 lsでディレクトリの中身を確認して、その名前とひっとするものがあれば、IFの中に入りたいのですが、エラーが出てしまいます。 正しい書き方をご存じのかたご回答のほど宜しくお願いします。 set `cat /DS/tmp/liste.fal |grep -v \#` for i do verz=$(dirname $i) set `ls $verz` for j do if (test $j = "Kommentar.txt") then echo "$j ist jetzt Kommentar.txt" echo "cp $j $zielverz" elif [[ "$j" =~ "*fal" ]] then echo "$j ist jetzt *.fal" echo "cp $j $zielverz" と続いていくのですが、[[ "$j" =~ "*fal" ]] この部分が間違っているようです。 シンタックエラーがでます。 私が検索したいファイル名はのようなかたちです。 riipe.fal フォルダの中には、他にも rippe.fal.neu rippe.erg.fal.neu Kommentar.txt という名前のものがあります。 宜しくお願いします。

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

「lsでディレクトリの中身を確認して、その名前とひっとするものがあれば、IFの中に入りたい」というのが, 何をしたいのか分かりません. とりあえず ・「ディレクトリの中身」を「確認する」というのはどういう操作なのか ・「その」が何を指しているのか ・「その名前とひっとするもの」の「もの」は何なのか が読み取れません. 「あなたのしたいこと」をもっと明瞭に (かつ理解しやすく) 書いてみた方がいいんじゃないかなぁ.

kenpanch7
質問者

お礼

コメントありがとうございました。 指定したファイルがある場合のみ、そのディレクトリの中の、そのファイルをディレクトリの階層を守ったままコピーまたは、リンクしたいのです。 ちなみに、試行錯誤した結果、 elif (echo $j | grep 'fal$') でできました。

  • taka37777
  • ベストアンサー率30% (166/544)
回答No.1

bone shellならば、ワイルドカードになりますが、case文を使ってみたらどうでしょうか? http://chaichan.web.infoseek.co.jp/src/BSH.htm#B10

kenpanch7
質問者

お礼

ありがとうございます。参考にさせていただきます。

関連するQ&A

  • if文がうまくできません;;

    こんにちわ。 当方、linux初心者です。 今if文を作っているのですが、どうしてもうまくいきません。 ●lsで出力した結果が何行出力されたかによって回答が変わるシェルを作成してください。(10以上と9~3と2以下の3種類) という例題を解答中ですが、下記のとおり作ったのですが 何かアドバイスは頂けませんか? お願い致します。 #!/bin/bash ls -l > case.txt P=`cat case.txt | wc -l` if $P -ge 10 then echo '10以上' elif $P -ge 3 ; then echo '3以上' elif $P -le 2 ; then echo '2以下' fi

  • bashでのif文内正規表現についての

    bashでのif文内正規表現についての質問です。 IPアドレスを正規表現にてマッチングさせたいのですが実現できなく困っています。 たとえば192.168.1.の1から128を引っ掛けたいのですがどうすれば実現できますか? 今は下記のように書いていますが、これではだめみたいです。 ARCHKIP=`netstat -rn | awk '{ print $1 }'` for i in `echo $ARCHKIP` do if [[ $i = 192.168.1.[1-128] ]];then echo "OK" fi done わかる方お教えください。

  • WSHの正規表現について

    WindowsXPのCACLSコマンドの出力結果(テキストにリダイレクト)に改行や復帰が入っていて、空行の削除をしたいのです。 下記のプログラムを作ったのですが、復帰コードが 入っている箇所がとれないのです。どなたかご教授お願い致します。。。 Set fso = CreateObject("Scripting.FileSystemObject") Set src = fso.GetFolder("C:\WORK") Set regEx1 = New RegExp srhStr1 = "^ *$" regEx1.Pattern = srhStr1 regEx1.Global = True regEx1.IgnoreCase = True Set TextFile = fso.OpenTextFile("cacls結果.txt") Do Until TextFile.AtEndOfStream tmpLine = TextFile.ReadLine If regEx1.Test(tmpLine) Then else srhLine = srhLine & tmpLine & vbNewLine End If Loop WScript.Echo srhLine

  • スクリプトの修正お願いします。

    ================スクリプト内容(sample)===================== #!/bin/sh # ls -l /home/sendfile/ > /tmp/dellist awk '{print $6"\t"$7"\t"$9}' /tmp/dellist > /tmp/list awk -v ARGUMENT="$1" ' BEGIN{ MON=substr(ARGUMENT,1,1) * 10 \ + substr(ARGUMENT,2,1) DAT=substr(ARGUMENT,4,1) * 10 \ + substr(ARGUMENT,5,1) } { echo $MON $DAT if ( "$1" -eq "Jan");then CMON=1 elif ( "$1" -eq "Feb" );then CMON=2 elif ( "%1" -eq "Mar" );then CMON=3 elif ( "%1" -eq "Apr" );then CMON=4 elif ( "$1" -eq "May" );then CMON=5 elif ( "%1" -eq "Jun" );then CMON=6 elif ( "%1" -eq "Jul" );then CMON=7 elif ( "%1" -eq "Aug" );then CMON=8 elif ( "%1" -eq "Sep" );then CMON=9 elif ( "$1" -eq "Oct" );then CMON=10 elif ( "%1" -eq "Nov" );then CMON=11 elif ( "%1" -eq "Dec" );then CMON=12 fi CDAT=substr($2) if [ [ MON > CMON ] || [ ( MON = CMON ) && ( DAT > CDAT ) ] ] {print} }' /tmp/dotFAX/list > /tmp/dotFAX/dellist ================ 実行 ===================== $ sample "08/07/06" ================ 上記の実行結果 ===================== awk: cmd. line:36: fatal: 1 is invalid as number of arguments for substr のようなErrが出ていますが、原因が分かりません。 間違っている箇所や修正お願いします。

  • シェルスクリプトで引数をファイル名に使うには?

    シェルスクリプトでutfとshift-jisの変換を行いたいと思ってます。 ファイル出力のところでファイル名を$1と引数にするとうまくいきません。(変換されてなかったり、空ファイルできたり) >! $1 ではなく $1.xx とかにするとうまくいきます。 どうしたら引数のファイル名に出力できるでしょうか? #!/bin/sh if [ $2 = 'us' ] then cp $1 $1.utf8 iconv -f UTF-8 -t SHIFT-JIS $1 >! $1 echo "$1 UTF-8 => SHIFT-JIS [ OK ]" elif [ $2 = 'su' ] then cp -f $1 $1.sjis iconv -f SHIFT-JIS -t UTF-8 $1 >! $1 echo "$1 SHIFT-JIS => UTF-8 [ OK ]" else echo "$1をコンバートできませんでした。" fi

  • Kシェルでの read line と awk

    お世話になっております。 AIX の 標準 kshell にて下記を実行したいと考えております。 <やりたいこと> recode.txt(逐一別のシェルで内容は変更される) の中身に書かれている文字を参照して、test.txt を読み込んで該当する文字列を読み込みたいと考えています。 test.txt は編集可能なので、誤記入対策の為に、空白/タブ行、先頭空白/タブ、行末空白/タブを無視出来るようにしたいと考えています。 例) recode.txt AAAAA test.txt # ~~コメント~~ # ~~コメント~~ # ~~コメント~~ # ~~コメント~~ <AAAAA> test1 test2 test3 <BBBBB> test10 test11 test12 test13 この場合、結果として、test1、test2、test3を得て、このファイルに対して別のシェルを実行したいと思っております。 recode.txt は read line を使って読み込めるのですが、とりあえずテストとして下記のように test.txt を awk( print $1 で先頭空白、先頭タブが無視されるようでしたので) をつかってみたのですが、上手くいきませんでした。 上手くいかないというよりは、「elif [[ ${jug} == "A" ]]; then」の elif がおかしいと言われ、どうも if ~ の部分がおかしいっぽいのですが……すいません、自分ではどうも原因が分からず困っております。 【test.ksh】 (~省略~) (recode.txt 読み込み処理) jug=X while read line ; do if [[ "`awk '{print $1}' ${line}`" == "#" || "`awk '{print $1}' ${line}`" == "" ]]; then elif [[ ${jug} == "A" ]]; then if [[ `awk '{print $1}' ${line}`" == "<BBBBB>" ]]; then break fi test2.ksh ${line} <エラーチェック> elif [[ ${jug} == "B" ]]; then test3.ksh ${line} <エラーチェック> elif [[ "`awk '{print $1}' ${line}`" == "<AAAAA>" and ${recode} == "AAAAA" ]]; then jug=A elif [[ "`awk '{print $1}' ${line}`" == "<BBBBB>" and ${recode} == "BBBBB" ]]; then jug=B fi done < test.txt (~省略~) $line の扱いが間違っているのか、それとも構文的なところなのか…… orz 本業がSEじゃないのでシェルに詳しくなく申し訳ないのですが、基本的なことと存じますが教えて頂けますと幸いです。 宜しくお願い致します。 ※投稿時に先頭空白が上手く処理されないようで、回避方法が解らず、全て左につめられてしまいまして見難く申し訳ありません。

  • UNIX

    UNIXの課題をやっていて、ここまで出来たのですが???の部分が 分かりません;誰か教えて頂けると助かります; 時間があれば説明も加えて頂けたら幸いです; #!/bin/bash #ふたつの引数の大小を判断し表示するシェルスクリプト if [ $# -lt 2 ] then echo "引数が足りません" exit fi cmp1=$1 cmp2=$2 if [ $cmp1 -gt $cmp2 ] then echo "$cmp1 ??? $cmp2" elif [ $cmp1 ??? $cmp2 ] then echo "$cmp1 = $cmp2" else echo "$cmp1 ??? $cmp2" fi

  • スクリプトファイル編集について

    ファイル編集について勉強なのですがどうしてもできません。 複数ファイル内よりIF構文を見つけてFILE_A.txtのIF書式へ変換する。 ※編集前にFILE_B.txtの変更箇所をコメント化して編集後に変換、 FILE_A.txtの書式であれば編集しない処理を作りたいと思うのですが・・・ FILE_A.txt if [ $? != 0 ] ; then   echo "てすと" fi 編集前 FILE_B.txt -- if [ -f $file ] then   echo "てすと" fi 編集後 FILE_B.txt -- #if [ -f $file ] #then if [ -f $file ] ; then   echo "てすと" fi 以上よろしくおねがいします。

  • シェルスクリプト shiftとwhile

    下記の内容はスクリプトの一部を抜粋した内容です。 2箇所、理解が出来ない部分があるので、教えて頂けますでしょうか。 ------------------------------------------------ shift $(( $OPTIND -1)) if [ $# -eq 0 ]; then FileName="" elif [ $# -eq 1 ]; then if [ "\-" = "$1" ]; then FileName="" else FileName="$1" fi else echo "オプションが多い" exit fi if [ "" = "$FileName" ]; then while read line; do fcnctionA "$line" done else while read line; do fcnctionA "$line" done < "$FileName" fi ------------------------------------------------ (1) if [ "\-" = "$1" ]; then 部分が理解できないのですが、教えて頂けますでしょうか。 (2)  if [ "" = "$FileName" ]; then while read line; do fcnctionA "$line" done 基本はファイル名を指定して実行する事を前提としていると思います。 ファイル名を指定しないでスクリプトの実行をする場合は、1行ずつ標準入力で 入力すると思うのですが、このような使い方をする場合はあるのでしょうか。 下記よりも便利な点があるようでしたら、教えて頂けますでしょうか。 または、shiftと関係があるのでしょうか? if [ ! "" = "$FileName" ]; then while read line; do fcnctionA "$line" done < "$FileName" fi

  • bashで、gotoのようなラベルによるジャンプ構文をしたいのですが、方法をご教授ください。

    bashで、gotoのようなラベルによるジャンプ構文をしたいのですが、方法をご教授ください。 今はif分毎で、エラー時にメール配信処理してますが、全て同じあて先配信なので、 簡潔に処理内容をまとめたいです。 echo "aaa" if [ $? -ne 0 ] then echo "error desu" > honbun.txt mailx -s "error" aaa@aaa.c.jp < honbun.txt exit 1 else echo "ok" fi echo "bbb" if [ $? -ne 0 ] then echo "error desu" > honbun.txt mailx -s "error" aaa@aaa.c.jp < honbun.txt exit 1 else echo "ok" exit 0