모두 한 줄로 구성된 큰 텍스트 파일이 있습니다. 텍스트에는 이와 같은 여러 부분이 있으며 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 …