タイトルが言うように、変数の最初と最後の両方で定義されたパターンを削除する方法を探しています。 #
と%
を使用する必要があることはわかっていますが、正しい構文がわかりません。
この場合、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/$##' )"
$ var='https://www.google.com/keep/score'
$ var=${var#*//} #removes stuff upto // from begining
$ var=${var%/*} #removes stuff from / all the way to end
$ echo $var
www.google.com/keep
あなたは2つのステップでそれをしなければなりません:
$ string="fooSTUFFfoo"
$ string="${string%foo}"
$ string="${string#foo}"
$ echo "$string"
STUFF
IS組み込みの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"を認識できるようにします-グロブ構文に対するbashの拡張(グロブスタイルのパターンを正規表現と同じようにする)。 ?(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);}')