파일 이름 목록이 있는데 다른 문자나 문자열이 포함된 항목을 제거하고 싶습니다.
내가 달리면
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
$GARG
Bourne과 유사한 셸(예: 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
아닌 것으로 가정 -
)