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つの問題があります。
まず、操作の正規表現が正しくありません。あなたの式は文字列を探しますいいえ
c
、s
または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]
何でも一致することに注意してください。一つc
、s
または以外の文字e
で、.
単一の文字と一致します。
答え4
以下を使用してこの問題を解決することもできます。sed
coursenum=$(sed 's/^.*\(cse[^/]*\)/.*$/\1/' <<< "${website_url}")
または、bashパラメータ置換を使用してください。
coursenum=cse${website_url#*cse}
coursenum=${coursenum%%\/}