bashで特定の部分文字列パターンと同じ変数を設定するには?

bashで特定の部分文字列パターンと同じ変数を設定するには?

cse常に3〜5文字で始まる文字列の部分文字列と同じ変数を設定しようとしています。

たとえば、入力文字列が次のような場合

http://website.com/class/cse111/homework2/test.html

ただ抽出したいのですが

cse111

この文字列から。

頑張りました

coursenum=$(grep -o '[^cse]...')

しかし、うまくいきません。この問題を解決する方法を知っている人はいますか?

ありがとう、

答え1

正規表現が間違っています。grep -Eo 'cse[^/]{3,5}'動作します。

  • cse文字通り文字列一致
  • [^/]{3,5}次の3〜5個の存在しない文字と一致します。/

関連部分が常に区切られた5番目のフィールドである場合は、このフィールドを代わりに/使用できます。cut -d/ -f5

答え2

示された割り当てコマンドが実際にスクリプトに含まれている場合は、2つの問題があります。

  • まず、操作の正規表現が正しくありません。あなたの式は文字列を探しますいいえcsまたはe、(実際に実行する操作)で始まる場合、[^cse]最初の文字の後に任意の3文字(...)が続くため、合計4文字のみが取得されます。

  • 第二に、あなたは議論を逃しましたgrep

を使用しbash、ソース文字列が変数に格納されている場合は、次の$courseurlものを使用できます。

coursenum="$(grep -o 'cse[^/]\{3,5\}' <<< "$courseurl")"

「ここの文字列」をサポートしていない他のシェルでは、次を使用します。

coursenum="$(echo "$courseurl" | grep -o 'cse[^/]\{3,5\}')"

それに加えて、コース番号が常にコースURLの3番目のコンポーネントである場合は、@ArkadiuszDrabcyzのコメントと@ Devonの解決策が正しい方向を伝えます。

通常、正規表現を初めて使用する場合は、次のようなことを検討することをお勧めします。正規表現または正規表現 101正規表現をテストし、要件と一致することを確認できます。

答え3

/文字列に5番目に区切られた文字列が必要な場合:

$ cut -d '/' -f 5 <<<'http://website.com/class/cse111/homework2/test.html'
cse111

cse次から始めて終わる文字列が必要な場合/

$ grep -o 'cse[^/]*' <<<'http://website.com/class/cse111/homework2/test.html'
cse111

次に、次のコマンドの置き換えに使用します。

num=$( grep -o 'cse[^/]*' <<<'http://website.com/class/cse111/homework2/test.html' )

[^cse]何でも一致することに注意してください。一つcsまたは以外の文字eで、.単一の文字と一致します。

答え4

以下を使用してこの問題を解決することもできます。sed

coursenum=$(sed 's/^.*\(cse[^/]*\)/.*$/\1/' <<< "${website_url}")

または、bashパラメータ置換を使用してください。

coursenum=cse${website_url#*cse}
coursenum=${coursenum%%\/}

関連情報