명령줄에서는 실행할 수 있지만 쉘 스크립트에서는 실행할 수 없습니다.

명령줄에서는 실행할 수 있지만 쉘 스크립트에서는 실행할 수 없습니다.

다음 형식의 파일이 있습니다.

436541,000454056,Smith,john,jsmith,[email protected]

",jsmith"를 추출하여 다른 파일 "test.txt"에 쓰고 싶습니다.

그래서 나는 다음을 사용합니다:

grep -o '\,[a-z][a-z0-9]{1,7}' source.txt > test.txt

명령줄에서는 제대로 작동합니다.

쉘 스크립트에서 사용할 때 test.txt 파일이 비어 있습니다.

#!/bin/bash
grep -o '\,[a-z][a-z0-9]{1,7}' source.txt > test.txt

어떤 제안이 있으십니까?

답변1

기본적으로 grep다음을 사용합니다 .기본 정규식(BRE) 지원되지 않습니다 {N}. 명령줄에서 작동하는 경우 grep별칭이 grep -E또는 로 설정되었을 가능성이 높습니다 grep -P. 다음을 실행하여 확인할 수 있습니다.

alias | grep grep

스크립트에서는 별칭이 활성화되지 않습니다. 설명된 대로 man bash:

Aliases are not expanded when the shell is not interactive, unless  the
expand_aliases  shell option is set using shopt.

따라서 비대화형 셸(스크립트를 실행할 때 얻는 셸)에서는 별칭이 작동하지 않습니다. 스크립트에서 별칭을 명시적으로 활성화한 다음 파일을 가져와 별칭 정의를 가져오는 두 가지 옵션이 있습니다( ~/.bashrc이스케이프할 필요 없음, btw).,

#!/bin/bash
shopt -s expand_aliases
source ~/.bashrc
grep -o ',[a-z][a-z0-9]{1,7}' source.txt > test.txt

또는 더 간단하게 grep -E스크립트 자체에서 다음을 사용합니다.

#!/bin/bash
grep -Eo ',[a-z][a-z0-9]{1,7}' source.txt > test.txt

당신은 또한 고려할 수 있습니다이런 도구awk그러나 필드로 구분된 데이터를 처리하도록 설계되었습니다. 아마도 당신의 삶을 훨씬 더 단순하게 만들어 줄 것입니다.

답변2

텍스트 파일의 구조가 동일한 경우 awk를 사용할 수도 있습니다.

awk -F"," '{print $5}' INPUTFILE.txt >> test.txt 

그리고 cutCostas가 댓글에서 언급한 내용은

cut -d"," -f5 INPUTFILE.txt >> test.txt 

관련 정보