grep -E 결과를 깨는 방법

grep -E 결과를 깨는 방법

파일이 있어요

gretting: hello the world
gretting: good morning
gretting: good evening
Gbye: goodbye
Gbye: see you

변수를 할당합니다

var = grep -E -i "greeting"

그러면 var는 인사말 3줄과 같습니다.

var = "gretting: hello the world
gretting: good morning
gretting: good evening"

var를 각 행으로 나누고 이를 다른 변수(예 temp1: temp2..) 에 할당하려면 어떻게 해야 합니까?

temp1 = "gretting: hello the world
temp2 = "gretting: good morning
temp3 = "gretting: good evening"

감사해요

답변1

모드에서 -E기본 정규식 구문을 확장 정규식 구문으로 전환하는 옵션 입니다.E

에는 gretting기본 또는 확장 정규식 연산자가 없으므로 -E차이가 없으며 -F고정 F문자열을 사용할 수도 있습니다.

POSIX와 유사한 셸에서 처음 3줄을 3개의 다른 셸 변수에 할당하려면 다음을 수행합니다.

readln() for _var; do IFS= read -r "$_var"; done

grep -Fi gretting file | readln temp1 temp2 temp3

그러나 기본적으로 bash파이프라인의 가장 오른쪽 부분을 포함하는 여러 셸에서는 하위 셸에서 실행되므로 파이프라인 크기가 조정되면 이러한 변수가 손실되므로 동일한 파이프라인 구성 요소에서 실행해야 합니다. 다음에서 사용하세요.

grep -Fi gretting file | {
  readln temp1 temp2 temp3
  do-something-with "$temp1" "$temp2" "$temp3"
}

또는 ksh 스타일을 사용하십시오.

readln temp1 temp2 temp3 < <(grep -Fi gretting file)

또는 야쉬에서:

readln temp1 temp2 temp3 <(grep -Fi gretting file)

grep백그라운드에서 실행되며 출력은 현재 셸의 파이프에서 읽혀집니다 .

GNU 구현을 사용 하면 grep. 이것이 없으면 계속 진행되지만 반환 시 파이프가 끊어진 후 추가 일치 항목을 출력하면 결국 SIGPIPE에 의해 종료될 수 있습니다.-m3grepgrepreadln


¹옵션이 활성화되지 않은 한(예: 상호작용 시) shopt -s lastpipe이를 방지할 수 있습니다.bashmonitor

답변2

$ grep -i gretting file
gretting: hello the world
gretting: good morning
gretting: good evening

$ readarray -d $'\n' -t temp < <(grep -i gretting file)

$ echo "${temp[0]}"
gretting: hello the world
$ echo "${temp[1]}"
gretting: good morning
$ echo "${temp[2]}"
gretting: good evening

또는 어떤 이유로 중간 스칼라 변수를 사용하려는 경우:

$ var=$(grep -i gretting file)

$ readarray -d $'\n' -t temp <<<"$var"

$ echo "${temp[0]}"
gretting: hello the world
$ echo "${temp[1]}"
gretting: good morning
$ echo "${temp[2]}"
gretting: good evening

관련 정보