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