web-dev-qa-db-ja.com

変数の最初と最後の両方で部分文字列一致パターンを削除します

タイトルが言うように、変数の最初と最後の両方で定義されたパターンを削除する方法を探しています。 #%を使用する必要があることはわかっていますが、正しい構文がわかりません。

この場合、http://を最初に削除し、/score/を変数$lineの末尾から削除します。これは、file.txtから読み取られます。

20
bobylapointe

ネストできません${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/$##' )"
21
user80168
$ 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
7
jaypal singh

あなたは2つのステップでそれをしなければなりません:

$ string="fooSTUFFfoo"
$ string="${string%foo}"
$ string="${string#foo}"
$ echo "$string"
STUFF
2
Gilles Quenot

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_です。

2
Charles Duffy

いかがですか

export x='https://www.google.com/keep/score';
var=$(Perl -e 'if ( $ENV{x} =~ /(https:\/\/)(.+)(\/score)/ ) { print qq($2);}')
0
michael501