Bash의 텍스트 파일에서 텍스트 추출

Bash의 텍스트 파일에서 텍스트 추출

모두 한 줄로 구성된 큰 텍스트 파일이 있습니다. 텍스트에는 이와 같은 여러 부분이 있으며 foo=12345파일의 나머지 부분은 무시하고 해당 부분을 모두 별도의 줄로 추출해야 합니다.

예를 들어:

random junk foo=12345 more junk random junk foo=2345 junk foo=7654 junk random foo=5432 junk

내가 나가고 싶은 것은 :

12345
2345
7654
5432

추출하기 위해 정규식을 작성하는 방법을 알고 있지만 foo=([0-9]+)이를 텍스트에 적용하고 bash에서 줄을 가져오는 방법을 잘 모르겠습니다.

답변1

$> echo "random junk foo=12345 more junk random junk foo=2345 junk foo=7654 junk random foo=5432 junk" | grep --only-matching --perl-regexp "(?<=foo=)[0-9]+"
12345
2345
7654
5432

우리가 여기서 하는 일은 "(?<=foo=)[0-9]+".

답변2

나는 awk긴 줄을 레코드로 구문 분석하는 데 익숙합니다.

awk 'BEGIN{FS="=";RS=" "}/^foo=/{print $2}'

그러면 각 "단어"가 해당 단어 내에서 "="로 구분된 필드와 함께 별도의 레코드로 설정됩니다. 그러면 왼쪽이 "foo"이면 '='의 오른쪽만 출력됩니다. $1=="foo""="가 없으면 첫 번째 필드가 전체 레코드와 동일하므로 대신 정규식을 사용해야 합니다 .

답변3

쉘 구성만 사용하여 이 작업을 수행할 수 있습니다. 데이터를 변수로 읽은 다음 $IFS변수를 문자 단위(기본값은 공백)로 분할하고 필요한 청크를 유지합니다. 큰따옴표 밖의 변수 대체는 토큰화(여기서 원하는 것) 및 파일 이름 생성(일명 와일드카드, 원하지 않는 것)을 거치므로 먼저 와일드카드를 끄십시오 set +f.

set +f
for x in $(cat /path/to/file); do
  case "$x" in
    foo=*) echo "${x#*=}";;
  esac
done
set -f

cat를 호출하는 대신 내장 함수를 사용할 수 있습니다 read.

set +f
read -r line </path/to/file
for x in $line; do …

관련 정보