27

タイトルが示すように、変数の先頭と末尾の両方で定義済みのパターンを削除する方法を探しています。#andを使用する必要%があることはわかっていますが、正しい構文がわかりません。

この場合、から読み取った変数http://の先頭と/score/末尾を削除したいと思います。$linefile.txt

4

5 に答える 5

30

${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/$##' )"
于 2013-06-16T00:09:36.537 に答える
3

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

$ string="fooSTUFFfoo"
$ string="${string%foo}"
$ string="${string#foo}"
$ echo "$string"
STUFF
于 2013-06-16T00:09:20.870 に答える
2

組み込みの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では ではなくを使用しています。これは、 の動作の多くが実装定義であるためです。たとえば、変数の内容がまたはである場合を考えてみてください。echoecho-e-n

于 2013-06-16T01:41:29.207 に答える
0

どうですか

export x='https://www.google.com/keep/score';
var=$(perl -e 'if ( $ENV{x} =~ /(https:\/\/)(.+)(\/score)/ ) { print qq($2);}')
于 2013-06-16T17:22:43.167 に答える