パラメータ展開 "${parameter/pattern/string}"
を用いてパターン置換を行えますが、string
または /string
をなくすとパターン削除を行えます。
パターンに関しては別記事にしました。
※パラメータ展開の詳細は man bash
等を参照。
※パターンマッチングの詳細は man bash
等を参照。
参考「3.5.3 Shell Parameter Expansion - Bash Reference Manual」
参考「3.5.8.1 Pattern Matching - Bash Reference Manual」
1. 最長一致
パターン置換を用いたパターン削除 | 意味 |
---|---|
"${parameter/#pattern}" |
前方一致"${parameter##pattern}"
|
"${parameter/%pattern}" |
後方一致"${parameter%%pattern}"
|
"${parameter/pattern}" "${parameter//pattern}"
|
部分一致 |
※パラメータ展開 "${parameter/#pattern}"
および "${parameter/%pattern}"
はシェルオプション nocasematch
の影響を受けますが、パラメータ展開 "${parameter##pattern}"
および "${parameter%%pattern}"
は影響を受けません。
パラメータ展開 "${parameter/pattern/string}"
は最長一致でパターン置換を行うため、パターン置換を用いてパターン削除を行う場合も同様です。
#
function f() {
local -r parameter='foo bar baz'
echo "${parameter##* }"
echo "${parameter/#* }"
echo "${parameter%% *}"
echo "${parameter/% *}"
echo "${parameter/ }"
echo "${parameter// }"
}
f
baz
baz
foo
foo
foobar baz
foobarbaz
2. 最短一致
パラメータ展開 "${parameter/pattern/string}"
は最短一致でパターン置換を行えないため、拡張パターンを用いる等して最長一致に書き換えるか、またはパターンマッチングでなく正規表現等で置換します。
※シェルオプション nocasematch
の影響の有無に注意。
shopt -s extglob
#
function f() {
local -r parameter='foo bar baz'
echo "${parameter#* }"
echo "${parameter/#*([^ ]) }"
[[ "$parameter" =~ ' '(.*)$ ]] && echo "${BASH_REMATCH[1]}" || echo "$parameter"
echo "${parameter% *}"
echo "${parameter/% *([^ ])}"
[[ "$parameter" =~ ^(.*)' ' ]] && echo "${BASH_REMATCH[1]}" || echo "$parameter"
}
f
bar baz
bar baz
bar baz
foo bar
foo bar
foo bar