파일이 있어요
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에 의해 종료될 수 있습니다.-m3
grep
grep
readln
¹옵션이 활성화되지 않은 한(예: 상호작용 시) shopt -s lastpipe
이를 방지할 수 있습니다.bash
monitor
답변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