Bash正規表現文字列操作エラー

Bash正規表現文字列操作エラー

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文字列をフィールドに分割する方が良いかもしれません。

おすすめ記事