bashと正規表現の一致機能について質問があります。今これはbashのバグだと思いますが、明らかなものが欠けている可能性があります。後者になりたいです。
アドレスをフィールドに漏らすために、bashスクリプトでこの関数を作成しました。最終的に削除されるいくつかのデバッグ出力があります。
# name number, zip
function split_address
{
local adr
adr="$4"
echo $adr
local adr_regex
adr_regex="[ ]*(.*[a-z ]) ([^,][^,]*),[ ]*([^ ]*)[ ]*"
[[ $adr =~ $adr_regex ]]
echo 1:X${BASH_REMATCH[1]}X
echo 2:X${BASH_REMATCH[1]%% }X
echo 3:Y${BASH_REMATCH[2]}Y
echo 4:Y${BASH_REMATCH[2]%% }Y
local x="${BASH_REMATCH[1]}"
echo 5:X${x%% }X
local x="${BASH_REMATCH[1]%% }"
echo 6:X${x}X
echo 7:X${x%% }X
eval "$1='${BASH_REMATCH[1]%% }'"
eval "$2='${BASH_REMATCH[2]%% }'"
eval "$3='${BASH_REMATCH[3]}'"
}
私は次のようにテストします:
split_address roadname number zip " Some string 42 dp , 1234 "
echo X${roadname}X Y${number}Y Z${zip}Z
呼び出すと、次のような結果が表示されます。
Some string 42 dp , 1234
1:XSome string X
2:XSome string X
3:Y42 dp Y
4:Y42 dpY
5:XSome string X
6:XSome string X
7:XSome stringX
XSome string X Y42 dpY Z1234Z
まず、4では、3に示されているスペースを削除しました。これが1を扱うときに2で起こることを望みます。変数xにこのようなことがあっても、5はスペースを削除しません。これはこの問題を解決する試みです。その後、変数xにスペース除去操作を割り当てようとしましたが、やはり失敗しました(図6を参照)。ただし、ステップ7でxのスペースを削除すると、行は5に等しくなり、入力は明らかにそれでも機能します。
これは私が奇妙なことをしているのでしょうか、それともbashのバグですか?
ちなみに、私はbashバージョン4.3.11(1)リリースでUbuntu 14 LTSを使用しています。
bashバージョン4.1.17(9-release.x)を使用するCygwin-x64でも同じ動作が発生します。
削除される文字が実際に空白であることを確認しました(ソース呼び出しとテスト呼び出しの両方でodを使用)。
ベストアンサー1
%%
する全体的な状況一致、一致しない正規表現。これは${foo%% }
、aに一致する最長の末尾の文字列が削除されることを意味します。一つもちろん、空白文字である空白文字と${foo%% *}
最も長い末尾の文字列は削除されます。スタートスペース文字で。
awk
文字列をフィールドに分割する方が良いかもしれません。