다음과 같은 정보가 포함된 파일이 있습니다.
Info A: 1
Info B: 2
Info C: 3
Info D: 4
Info A: 1
Info B: 2
Info C: 123
Info D: 4
이제 Info C를 이용해서 라인을 구하려고 하는데, 따로 사용해야 합니다. 첫 번째 블록에 대한 Info C의 출력을 가져오는 명령과 두 번째 블록에 대한 Info C의 출력을 가져오는 명령이 필요합니다. 이 명령은 두 블록 C의 정보를 얻는 데 효과적이었습니다. 명령의 첫 번째 부분에서는 Info C가 포함된 줄을 제외한 모든 줄을 삭제합니다. 명령의 두 번째 부분에서는 "Info C:" 문자열을 삭제합니다.
cat test2 | sed -e '/Info C: /!d' -e 's/Info C: //'
출력에는 다음 값만 포함됩니다.
3
123
이제 혼자서 해결하기 위해 sed의 여러 매개변수를 시도했지만 아무것도 효과가 없었습니다.
다음 솔루션이 나에게 적합합니다. 첫 번째 또는 마지막 줄만 인쇄합니다.
cat test2 | sed -e '/Info C: /!d' -e 's/Info C: //' | sed -n '$p'
cat test2 | sed -e '/Info C: /!d' -e 's/Info C: //' | sed -n '1p'
하지만 알고 싶습니다. sed 두 번째 파이프가 없는 솔루션이 있나요?
답변1
쉘이 배열을 지원한다면 다음과 같이 할 수 있습니다:
$ infoC=( $(sed -n 's/Info C: \(.*\)/\1/p' file ) )
$ echo ${infoC[0]}
3
$ echo ${infoC[1]}
123
또는 GNU를 사용하십시오 sed
.
infoC=($(sed -rn 's/Info C: (.*)/\1/p' file ))
sed
여기서는 더 간단한 명령을 사용하고 있습니다 . 정상적인 출력을 억제 하므로 -n
사용자가 지시한 행만 인쇄합니다. 대체 연산자는 다음 줄과 일치합니다 Info C:
.포착(괄호 포함) 다른 이름으로 저장할 값입니다 \1
. 따라서 줄을 교체 \1
하고 인쇄합니다( p
마지막 줄).
이는 배열의 출력을 배열에 저장하는 방법입니다 var=( $(command) )
. 첫 번째 요소는 다음과 같고 두 번째 요소는 다음과 같습니다. 여기서 배열 이름은 입니다.command
var
${var[0]}
${var[1]}
infoC
답변2
cat test2 | sed -e '/Info C: /!d' -e 's/Info C: //' | sed -n '1p;$p'