bash 正規表現など

マッチした部分の抽出

#!/bin/bash

item="recty-8.10.12"

if [[ ${item} =~ ([0-9]+)\.([0-9]+)\.([0-9]+)$ ]]; then
    echo '${BASH_REMATCH}='"${BASH_REMATCH}"
    echo '${BASH_REMATCH[0]}='"${BASH_REMATCH[0]}"
    echo '${BASH_REMATCH[1]}='"${BASH_REMATCH[1]}"
    echo '${BASH_REMATCH[2]}='"${BASH_REMATCH[2]}"
fi

で条件囲むことを忘れない

${BASH_REMATCH}=8.10.12
${BASH_REMATCH[0]}=8.10.12
${BASH_REMATCH[1]}=8
${BASH_REMATCH[2]}=10

# 前方一致

#!/bin/bash

list="foo-2d foo-3d foo-3d-foo-4d gas-1d"
echo "list = ${list}"
echo '${name#foo-} で除去'
for name in ${list}; do
   echo "$name --> ${name#foo-}"
done

echo '${name##*foo-} で除去'
for name in ${list}; do
   echo "$name --> ${name##*foo-}"
done
list = foo-2d foo-3d foo-3d-foo-4d gas-1d
${name#foo-} で除去
foo-2d --> 2d
foo-3d --> 3d
foo-3d-foo-4d --> 3d-foo-4d
gas-1d --> gas-1d
${name##*foo-} で除去
foo-2d --> 2d
foo-3d --> 3d
foo-3d-foo-4d --> 4d
gas-1d --> gas-1d

# 前方一致

#!/bin/bash
list=("foo-2d" "gas-2d" "gas-2d" "foo-2d-gas-2d")
# 後方一致
echo "list=${list[@]}"
echo '${name%-2d} で除去'
for name in ${list[@]}; do
   echo "$name --> ${name%-2d}"
done

echo '${name%%-2d*} で除去'
for name in ${list[@]}; do
   echo "$name --> ${name%%-2d*}"
done

echo '配列を、${name%%-2d*} で除去'
newlist=${list[@]%%-2d*}
echo ${newlist}
list=foo-2d gas-2d gas-2d foo-2d-gas-2d
${name%-2d} で除去
foo-2d --> foo
gas-2d --> gas
gas-2d --> gas
foo-2d-gas-2d --> foo-2d-gas
${name%%-2d*} で除去
foo-2d --> foo
gas-2d --> gas
gas-2d --> gas
foo-2d-gas-2d --> foo
配列を、${name%%-2d*} で除去
foo gas gas foo

置換

#!/bin/bash

list=("foo-3d" "foo-3d-foo-4d" "gas-1d")
echo "list = ${list[@]}"
# 前方のみ
echo '${name/foo-/dac-/} で置換'
for name in ${list[@]}; do
   echo "$name --> ${name/foo-/dac-/}"
done
# すべて
echo '${name//foo-/dac-/} で置換'
for name in ${list[@]}; do
   echo "$name --> ${name//foo-/dac-/}"
done

echo '${name^} で先頭だけ大文字'
for name in ${list[@]}; do
   echo "$name --> ${name^}"
done
echo '${name^^} で全て大文字'
for name in ${list[@]}; do
   echo "$name --> ${name^^}"
done

list=("FOO-3D" "FOO-3D-FOO-4D" "GAS-1D")
echo "list = ${list}"
echo '${name,} で先頭だけ小文字'
for name in ${list[@]}; do
   echo "$name --> ${name,}"
done
echo '${name,,} で全て小文字'
for name in ${list[@]}; do
   echo "$name --> ${name,,}"
done
list = foo-3d foo-3d-foo-4d gas-1d
${name/foo-/dac-/} で置換
foo-3d --> dac-/3d
foo-3d-foo-4d --> dac-/3d-foo-4d
gas-1d --> gas-1d
${name//foo-/dac-/} で置換
foo-3d --> dac-/3d
foo-3d-foo-4d --> dac-/3d-dac-/4d
gas-1d --> gas-1d
${name^} で先頭だけ大文字
foo-3d --> Foo-3d
foo-3d-foo-4d --> Foo-3d-foo-4d
gas-1d --> Gas-1d
${name^^} で全て大文字
foo-3d --> FOO-3D
foo-3d-foo-4d --> FOO-3D-FOO-4D
gas-1d --> GAS-1D
list = FOO-3D
${name,} で先頭だけ小文字
FOO-3D --> fOO-3D
FOO-3D-FOO-4D --> fOO-3D-FOO-4D
GAS-1D --> gAS-1D
${name,,} で全て小文字
FOO-3D --> foo-3d
FOO-3D-FOO-4D --> foo-3d-foo-4d
GAS-1D --> gas-1d