두 문자열을 비교하지만 공백을 무시하는 방법은 무엇입니까? 나는 다음을 수행하고 있습니다 :
if [ "$a" == "$b" ]; then
echo ok
fi
그런데 어울리지 않는 것 같습니다. "a"와 "b"가 무엇인지 인쇄했는데 둘은 동일합니다. 그러나 그들은 다른 줄 바꿈을 사용하는 것 같습니다.
답변1
기술적으로 모든 공백을 무시하려면 다음 두 문자열을 전달할 수 있습니다 tr
.
[ "$(echo "$a" | tr -d '[:space:]')" = "$(echo "$b" | tr -d '[:space:]')" ]
그러나 이렇게 하면 비교하기 전에 모든 공백이 제거되므로 예를 들어 "a b"
및 "ab"
동일성을 테스트합니다. 이것이 바람직한지 잘 모르겠습니다. tr
필요한 작업을 수행하도록 필터를 조정할 수 있습니다 . 예를 들어 모든 스타일 줄 바꿈만 제거하려면 다음을 수행할 수 있습니다 tr -d '\n\r'
.
답변2
Bash에서는 다음을 사용할 수 있습니다.매개변수 확장 구문특정 문자가 제거된(또는 보다 일반적으로 패턴 발생을 대체하는) 변수의 값을 가져옵니다.
if [[ "${a//[$' \t\n\r']/}" == "${b//[$' \t\n\r']/}" ]]; then
echo ok
fi
문제가 "다른 개행 문자를 사용"하는 것이라면 아마도 그 중 하나가 Windows 파일에서 온 것임을 의미할 것입니다. Windows 라인에는 $'\r
개행 문자( ) 앞에 추가 CR(bash 구문의 캐리지 리턴)이 있습니다 $'\n'
. 여러 줄의 문자열이 있는 경우 CR 문자만 제거하면 됩니다.
if [[ "${a//$'\r'/}" == "${b//$'\r'/}" ]]; then
echo ok
fi
변수가 단일 행 문자열인 경우 문제가 있는 CR이 끝에 표시되며 접미사 제거 구문을 사용할 수 있습니다.
if [[ "${a%$'\r'}" == "${b%$'\r'}" ]]; then
echo ok
fi
간단한 sh 형식이 필요한 경우 (덜) 어려움은 CR 문자를 입력하는 것입니다.
cr=$(printf '\r')
if [[ "${a%$cr}" == "${b%$cr}" ]]; then
echo ok
fi