Bash 스크립트, grep, VAR의 매개변수?

Bash 스크립트, grep, VAR의 매개변수?

파일 이름 목록이 있는데 다른 문자나 문자열이 포함된 항목을 제거하고 싶습니다.

내가 달리면

cat <file> | grep -Ev 'P1|P2'

Bash 쉘에서는 작동합니다.

하지만 스크립트에서는

#!/bin/bash
...
PLIST="f,d"    #test example
GARG="'$(echo $PLIST | tr "," "|" |tr -d "\n")'"
cat $FNAME | grep -Ev $GARG

이것은 작동하지 않습니다. 파일의 모든 줄만 나열합니다.

나는 값이 'f|d'인 $GARG를 에코하려고 합니다.

문제는 GARG를 생성한 방식입니다.

GARG=$(echo $PLIST | tr "," "|" |tr -d "\n")

이것은 작동하지만 $GARG 를 echo하면 값은 ' ' 문자 없이 f|d 입니다.

'' 문자에서는 작동하지 않지만 문자 없이는 작동하는 이유를 이해할 수 없습니다.

답변1

$FNAME$GARGBourne과 유사한 셸(예: bash)에서 에 저장된 확장 정규식과 일치하지 않는 파일에 경로가 저장된 줄을 인쇄하려면 구문은 다음과 같습니다.

FNAME=/path/to/some/file
GARG='P1|P2'
grep -Eve "$GARG" < "$FNAME"

ksh93과 유사한 셸(예: bash)에서 배열의 요소가 포함된 줄을 제거하려면(해당 요소에 개행 문자가 포함되어 있지 않고 배열이 비어 있지 않다고 가정):

list=(P1 P2)
FNAME=/path/to/some/file
grep -Fv "${list[@]/#/-e}" < "$FNAME"

또는:

list=(P1 P2)
FNAME=/path/to/some/file
printf '%s\n' "${list[@]}" | grep -Fvf - -- "$FNAME"

( $FNAME아닌 것으로 가정 -)

관련 정보