タイトルが示すように、変数の先頭と末尾の両方で定義済みのパターンを削除する方法を探しています。#
andを使用する必要%
があることはわかっていますが、正しい構文がわかりません。
この場合、から読み取った変数http://
の先頭と/score/
末尾を削除したいと思います。$line
file.txt
${var%}
/操作をネストすることはできない${var#}
ため、一時変数を使用する必要があります。
ここみたいに:
var="http://whatever/score/"
temp_var="${var#http://}"
echo "${temp_var%/score/}"
または、(たとえば) sed で正規表現を使用できます。
some_variable="$( echo "$var" | sed -e 's#^http://##; s#/score/$##' )"
あなたは2つのステップでそれをしなければなりません:
$ string="fooSTUFFfoo"
$ string="${string%foo}"
$ string="${string#foo}"
$ echo "$string"
STUFF
組み込みのbash機能のみを使用して1ステップで実行する方法があります(のような実行中の外部プログラムはありませんsed
)-次の場合BASH_REMATCH
:
url=http://whatever/score/
re='https?://(.*)/score/'
[[ $url =~ $re ]] && printf '%s\n' "${BASH_REMATCH[1]}"
=~
これは、テストの右側の正規表現と一致し、グループをBASH_REMATCH
配列に入れます。
つまり、2 つの PE 式と一時変数を使用する方がより一般的です。
shopt -s extglob
url=http://whatever/score/
val=${url#http?(s)://}; val=${val%/score/}
printf '%s\n' "$val"
...上記の例ではextglob
、シェルが「extglobs」を認識できるようにするためにオプションが使用されています。これは、glob 構文に対する bash の拡張 (glob スタイルのパターンを正規表現と同等の力で作成する) であり、オプションであることを?(foo)
意味しfoo
ます。
ちなみに、これらの例printf
では ではなくを使用しています。これは、 の動作の多くが実装定義であるためです。たとえば、変数の内容がまたはである場合を考えてみてください。echo
echo
-e
-n
どうですか
export x='https://www.google.com/keep/score';
var=$(perl -e 'if ( $ENV{x} =~ /(https:\/\/)(.+)(\/score)/ ) { print qq($2);}')