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문자열을 필드로 분할하는 것이 더 나을 수도 있습니다.

답변2

주어진 해결책을 따르십시오https://stackoverflow.com/questions/369758/how-to-trim-whitespace-from-bash-variable내 스크립트를 다음과 같이 수정했습니다.

echo "8:X${BASH_REMATCH[1]%"${BASH_REMATCH[1]##*[![:space:]]}"}X"
eval "$1='${BASH_REMATCH[1]%"${BASH_REMATCH[1]##*[![:space:]]}"}'"

이것은 이중 문자열 작업이며 첫 번째/내부 부분은 후행 공백을 제외한 모든 것을 제거합니다. 그런 다음 이 문자열은 원래 문자열 끝의 동일한 공백을 자르는 데 사용됩니다.

관련 정보