변수의 문자를 기준으로 문자열을 필터링하는 방법은 무엇입니까?

변수의 문자를 기준으로 문자열을 필터링하는 방법은 무엇입니까?

아래 명령의 문자열 변수에서 특수 문자를 변수로 전달하여 제거하려고 합니다. 여러 문자 대신 단일 문자를 제거할 수 있습니까?

string=#@$AAA%* 
a=#$@%*                  # Special characters which have to remove from variable
b=`echo $string|sed 's/\${a}//g'`
echo $b

답변1

최신 셸의 "매개변수 확장"을 사용할 때는 외부 명령을 실행할 필요가 없습니다.

echo ${string//["$a"]}
AAA

답변2

명령에 문제가 있습니다.

  • string=#@$AAA%*and a=#$@%*: 여기서 $AAAand $@부분은 변수로 해석됩니다. 문자열이 문자 그대로 해석되도록 작은따옴표를 사용해야 합니다.
  • sed부분에서는 리터럴 문자열을 바꾸도록 요청합니다.#$@%* ~을 위한아무것도 아님. 개별 문자를 원하는 경우 문자 클래스와 같은 다른 형식을 사용해야 합니다 [#$@%*]. 하지만 이 경우에는 그냥 사용하기 때문에 tr -d훨씬 간단합니다.
  • 또한 $(…)백틱보다 낫습니다.
  • <<<또한 몇 번의 사이클을 절약하기 위해 여기에서는 echo 대신 string( )을 사용합니다 .
  • "Kusalananda가 변수 주위에 따옴표를 추가하기 위해 내 답변을 편집한 것을 확인했습니다 . 나도 이것에 대해 생각해 봤지만 그것이 더 간단하고 특정 문제에 필요하지 않기 때문에 그렇게 하지 않을 것이라고 생각했습니다. 그러나 나는 이것이 일을 수행하는 "올바른" 방법이라는 데 동의합니다. "다른 변수와 구문 주위에 따옴표를 추가 했습니다 $(…). 이 경우에는 필요하지 않지만 좋은 습관이기도 합니다.

그래서 마지막 명령은

string='#@$AAA%*'
a='#$@%*'
b="$(<<<"$string" tr -d "$a")"
echo "$b"

관련 정보