다음 형식의 파일이 있습니다.
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
그리고 cut
Costas가 댓글에서 언급한 내용은
cut -d"," -f5 INPUTFILE.txt >> test.txt