変数または文字列でgrepを使用する方法は?


2

私はbashスクリプトを書いており、ファイル名の末尾にピリオドが付いているかどうかを確認する必要があります(もしそうならそれを取得しますが、変数または文字列で正規表現を使用する方法を理解することはできません)。

次のようにecho、文字列をgrepにパイプするために端末で使用できました。

 echo "filename.txt.123" | egrep -o "\.[0-9]+$" | egrep -o "[0-9]+"

しかし、この出力を変数に割り当てる必要があります。私はこれを試しました:

 revNumber= echo "filename.txt.123" | egrep -o "\.[0-9]+$" | egrep -o "[0-9]+"

しかし、それは機能しません。他にもたくさん試しましたが、有効なものはありませんでした。

私のbashスクリプトでは、文字列ではなく変数でgrepを使用しますが、ここでの概念は同じです。

文字列または変数にgrepを使用して、結果を別の変数に保存するにはどうすればよいですか?


バッククォートでそれを解決することはできません。これは、コマンドの出力を変数に取得するための構文です。r=`echo abc`エコー$ r
barlop 14

回答:


5

コマンドの出力を変数に割り当てるには、次を使用します$()

revNumber=$(echo "filename.txt.123" | egrep -o "\.[0-9]+$" | egrep -o "[0-9]+")

あなたが気にすべてがされている場合は、一致、あなたは検討する必要がありますcase

case foo in
  f*) echo starts with f
   ;;
  *) echo does not start with f
   ;;
esac

いい答えだ。コマンド置換のバックティック/バッククォート形式については知っていましたが、その$()形式については忘れていました。
アルカノン14

@Arkanon:``古いスタイルです。$()きれいです。
sds 14

0

なぜgrepとecho I / Oが過剰になるのか、bash文字列処理機能を使用することをお勧めします。

TESTFNAME="filename.txt.283" # you can collect this from doing an ls in the target directory

# acquire last extension using a regexp, including the '.':
FEXT=$(expr "$TESTFNAME" : '.*\(\.[[:digit:]][[:digit:]]*\)')

# check if length is more than just the dot, that means we've got digits:
if [  ${#FEXT} -gt 1 ]; then
    echo "Gotcha!" $testFilename ${#FEXT} $FEXT # do whatever you like with the file
fi

正規表現は最適化でき、完全ではありませんが、基本は次のとおりです。

  • 。*の先頭はファイルの最後で検索します。
  • [[:digit ::]]は[0-9]とほぼ同じですが、読みやすくなっています

ここ TLDP 他のbash文字列操作機能をチェックしてください。


0

以下は、文字列の最後の値を抽出する前にbash正規表現比較を使用する別のオプションです。

if [[ $TESTFNAME =~ \.[0-9]+$ ]]; then
  VAL=$(egrep -o '[0-9]+$' <<<"$TESTFNAME")
fi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.