bash 변수에 저장된 문자열을 바꾸려면 sed를 호출하세요.

bash 변수에 저장된 문자열을 바꾸려면 sed를 호출하세요.

bashsed또는 을 사용하여 변수를 확장 하고 싶습니다 awk. 변수는 배열입니다.

예를 들어 스크립트는 배열에 포함된 문자열을 삭제해야 합니다. 나는 노력했다

ARRAY1=(
string1
string2
string3
)

sed -i '/${ARRAY1[@]}/d'  /etc/file

그리고

ARRAY1=(
string1
string2
string3
)

for i  in ${ARRAY1[@]} ;do sed -i '/$i/d'  /etc/file;done

그러나 그 중 어느 것도 작동하지 않으며 sed변수를 확장하지 않습니다.
어떻게 해야 하나요?

답변1

그리고 zsh:

array1=(
  string1
  string2
  string3
)
sed -i -e/$^array1/d file

의 정규식과 일치하는 모든 줄이 삭제됩니다 $array1.

또는 다음과 같이 할 수 있습니다(Bourne과 유사한 쉘).

regexps='string1
string2
string3'
grep -ve "$regexps" file

또는 문자열을 검색하려면 다음을 추가하세요 -F.

grep -F -v -e$^array1 # (zsh)

또는:

strings='string1
string2
string3'
grep -F -ve "$strings" # (any shell)

답변2

해결책을 찾고 ""대신 사용하세요 ''.

답변3

나는 sed를 사용하지 않지만 egrep -i -v를 사용합니다(-i는 대소문자를 구분하지 않습니다. -v는 패턴과 일치하지 않습니다).

egrep -i -v "$(echo ${ARRAY1[@]} | tr ' ' '|')" /etc/file

표현 방식

echo ${ARRAY1[@]} 

따옴표가 없기 때문에 새 줄이 인쇄되지 않으며 배열의 모든 문자열이 포함된 공백으로 구분된 문자열이 생성됩니다.

tr ' ' '|'

grep 표현식의 경우 모든 공백(또는)을 \|로 바꾸면 grep 명령에 대한 패턴이 구축됩니다.

이제 sed 사용을 고집한다면 몇 가지 옵션이 있으며 그 중 하나는 다음과 같습니다.

 sed -i $(echo ${ARRAY1[@]} | sed -e 's:\w\+:-e "/\1/d":g') /etc/file

그러면 별도의 sed 기본 sed 명령 -e "/stringFromArray/d"가 생성됩니다.

참고: 배열의 문자열에 공백이나 "/$|"가 없는지 확인하세요. 시도하는 방법에 따라 달라지는 솔루션이 있는 경우 방해가 될 수 있습니다.

관련 정보