문자열과 와일드카드 비교

문자열과 와일드카드 비교

파일의 첫 번째 줄과 마지막 줄에 특정 문자열이 포함되어 있는지 확인하려고 합니다. 파일은 다음 형식을 따릅니다.

HEADER 2016-11-7
...
TOTAL IS:    20938

HEADER첫 번째 줄에 문자열이 포함되어 있는지 확인한 다음 제거 하려고합니다 . 나는 가지고있다:

#get first line of file
header=`head -n +1 rubbish.txt`

echo $header

#If first line contains header, remove it and ouput it to new file
case "HEADER" in
    *"$header"*) tail -n +2 rubbish.txt > rubbish.txt.out
    header="TRUE"
    ;;
    *) echo no HEADER present ;;
esac

출력:

HEADER 10-10-2019                                                                                                                                                                                                                                       
no HEADER present

왜 제목이 없다고 나오나요?

답변1

word; 을(를) 바꾸었으므로 pattern다음과 같은 것을 원합니다:

...
case "$header" in
    HEADER*) tail -n +2 rubbish.txt > rubbish.txt.out
    header="TRUE"
    ;;
    *) echo no HEADER present ;;
esac
...

목표를 달성하는 또 다른 방법은 sed헤더 행이 있는 경우에만 헤더 행을 제거하는 것입니다( -i여기서 내부 편집을 위해 GNU 확장 사용).

sed -i '1{/^HEADER/d}' rubbish.txt

$파일의 마지막( ) 줄에 있는 잠재적인 바닥글 줄의 유사한 예:

sed -i '${/^TOTAL IS:/d}'  rubbish.txt

답변2

잘못된 사용법 case. if와일드카드 문자와 함께 사용됩니다.

if [[ "$(head -n +1 rubbish.txt)" =~ "HEADER" ]]; then
    tail -n +2 rubbish.txt > rubbish.txt.out
else echo no HEADER present
fi

관련 정보