pair 가 포함된 파일을 생각해 보세요 key=value
. 각각은 key
여러 s의 연결일 수 있습니다. key
즉, 여러 개의 key
가 하나의 에 매핑될 수 있습니다 value
. 그 이유는 key
각 단어가 길이에 비해 상대적으로 짧은 단어이므로 value
데이터가 더 적은 수의 줄로 "압축"되기 때문입니다.
예시(즉, 실제 값이 아님):
$ cat testfile
AA,BB,CC=a-lengthy-value
A,B,C=a-very-long-value
D,E,F=another-very-long-value
K1,K2,K3=many-many-more
Z=more-long-value
모든 key
s가 고유하고 다음 문자를 포함하지 않는다고 가정하면 유효합니다.
key
분리 기호:,
- 키 값 구분 기호:
=
- 공백 문자:
key
s는 어떤 형태로든 나타날 수 있습니다.미래(위의 제약 조건에 따라)지금또한 다음 정규 표현식을 준수합니다 [[:upper:]]{2}[[:upper:]0-9]
. 마찬가지로 value
s는 포함되지 않으므로 =
각 =
줄을 분할하는 데 안전하게 사용할 수 있습니다. 여러 줄 key
이나 줄이 없기 value
때문에 한 줄씩 처리하는 것도 안전합니다.
이 파일에서 데이터를 쉽게 추출하기 위해 getval()
다음과 같은 함수가 정의됩니다.
getval() {
sed -n "/^\([^,]*,\)*$1\(,[^=]*\)*=\(.*\)$/{s//\3/p;q}" testfile
}
따라서 호출은 대신 getval A
값을 반환합니다 . 또한 존재하지 않는 항목에 대해서는 아무것도 반환하지 않아야 합니다 .a-very-long-value
a-lengthy-value
key
질문:
- 견고성에 대한 현재 정의가
getval()
충분합니까? - 더 짧고, 더 표현적이고, 더 제한적인 다른 데이터 추출 방법이 있습니까?
어쨌든, 이 스크립트는 cygwin과 함께 실행되며 bash
함께 coreutils
제공됩니다. 따라서 여기서는 이식성이 필요하지 않습니다(즉, 보너스 포인트만 제공됨). 감사해요!
편집하다:
기능이 수정되고 키에 대한 설명이 추가되었습니다.
편집 2:
서식(여러 줄 없음) 및 이식성(요구 사항 아님)에 대한 참고 사항을 추가했습니다.
답변1
다음을 사용하여 더 읽기 쉬운 형식으로 작성할 수 있습니다 awk
.
getval() {
awk -F'=' '$1~/\<'"$1"'\>/{print $2}' testfile
}
답변2
그리고 sed
...
getval() { sed "/^\([^=]*,\)*$1[,=]/!d;s/.*=//;q"; } <infile
그러나 $1
입력의 유효성을 검사할 수도 있습니다.
또는 GNU를 사용 grep
하고 다음을 수행하십시오 cut
.
getval() { grep -Em1 "^([^=]*,)*$1[,=]" | cut -d= -f2-; } <infile