다음과 유사한 감사 명령 목록이 있습니다.
1. -a *policy name=PolicyName -a *policy workflow name=PolicyWorkflow -a *policy action name=PolicyAction -s Server -b Storage -J Node -y 1 Months -o -F -S
2. -a *policy name=PolicyName -a *policy workflow name=PolicyWorkflow -a *policy action name=PolicyAction -s Server -b Storage -J Node -y 1 Months -o -F -S
3. -a *policy name=Policy Name -a *policy workflow name=PolicyWorkflow -a *policy action name=PolicyAction -s Server -b Storage -J Node -y 1 Months -o -F -S
각 name=Value
변수를 . 이것은 표준 모드이므로 읽기를 성공적으로 사용했지만 공백이 있는 줄(3번째 줄 참조)에 도달하면 모든 변수가 오프셋됩니다. 줄의 각 단어를 반복하고 특정 패턴을 일치시키지 않고 이 문제를 해결하는 방법을 잘 모르겠습니다. 누군가가 더 나은 해결책을 갖기를 바랍니다.
답변1
배열 변수를 사용 하면 bash
다음을 수행할 수 있습니다.
{ IFS=$'\n'; array=($(grep -Po 'name=[^-]+(?=\s*-)' infile)); }
그런 다음 배열의 요소를 인쇄합니다(Bash의 배열 인덱싱은 0부터 시작합니다).
printf '%s\n' "${array[@]}"
name=PolicyName
name=PolicyWorkflow
name=PolicyAction
name=PolicyName
name=PolicyWorkflow
name=PolicyAction
name=Policy Name
name=PolicyWorkflow
name=PolicyAction
아니면 단일 요소만 인쇄합니다.
printf '%s\n' "${array[6]}"
name=Policy Name
우리는 정의한다
IFS
"\n
ewline" 문자IFS=$'\n'
에단어 분리\n
결과의 "ewline" 문자에만 발생합니다.인용되지 않음–명령 대체$(...)
.구문이 알려져 있음
{ list; }
그룹화 명령나는 명령을 그룹화하는 데 익숙합니다.이
array=(...)
구문은 관련 항목을 만드는 데 사용됩니다.대량으로변수 이름은 입니다array
.를 사용하면 패턴과 일치하는 일치 항목만 인쇄합니다
grep -Po 'name=[^-]+(?=\s*-)' infile
.-o
"name="
하이픈을 제외하고 길이가 0이 아닌 문자가 오고 그[^-]+
뒤에는 하이픈까지 0개 이상의 공백이 옵니다(?=\s*-)
.- 구문 은 다음
(?=...)
과 같습니다기대된다grep의-P
옵션을 사용하면 패턴을 다음과 같이 해석하는 데 사용할 수 있습니다.Perl 호환 정규식(PCRE).
- 구문 은 다음
앞으로 읽을 내용: