bash
sed
또는 을 사용하여 변수를 확장 하고 싶습니다 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"가 생성됩니다.
참고: 배열의 문자열에 공백이나 "/$|"가 없는지 확인하세요. 시도하는 방법에 따라 달라지는 솔루션이 있는 경우 방해가 될 수 있습니다.