키-값 쌍 잘라내기

키-값 쌍 잘라내기

cutCSV 파일에서 지정된 열을 자르는 데 사용할 수 있는 방법과 같이 텍스트에서 키-값 쌍(키가 고유하고 지정됨)을 자르는 간단한 방법을 찾고 있습니다 . 내가 찾고 있는 키가 행에서 항상 동일한 상대 위치에 있는 것은 아닙니다. 즉, 내가 찾고 있는 키가 항상 동일한 구분 열에 있지 않기 때문에 cut후행 키를 사용하면 sed작동하지 않습니다 ,.

문제의 텍스트는 실제로 CSV이지만 값이 .로 끝나는 키/값 쌍인 경우가 발생합니다 =.

예를 들어 다음 세 줄로 파일을 구문 분석할 수 있습니다.

Foo=1, Bar=2, Baz=3
Bar=4, Foo=2, Baz=3
Bar=42, Baz=42, Foo=3

특정 키에 대한 키/값 쌍을 생성하기 위해 이 텍스트를 잘라내고 싶습니다. 이것이 내가 찾고 있는 것이라면 Foo내가 원하는 결과는 다음과 같습니다.

Foo=1
Foo=2
Foo=3

cut이상적으로는 와 유사한 구문을 갖고 표준 입력 및 파일에서 읽을 수 있는 명령줄 도구를 원합니다 .

그런 도구가 있나요?

답변1

grep-o이 작업은 다음 옵션을 사용하여 수행할 수 있습니다 .

grep -o 'Foo=[^,]*' file

답변2

awk대안 목록을 작성하는 솔루션:

awk -v RS=', ' -F'=' '$1=="Foo"' <file>

각 레코드를 로 구분하여 처리 ', '하고 각 레코드를 문자 필드로 분할합니다 =( 사용 -F). 그런 다음 첫 번째 필드와 일치하십시오 $1. 여기에 표시된 제안은 간단한 문자열 일치입니다. 정규 표현식을 자유롭게 사용하세요 $1~/\<Foo\>/.

답변3

상황의 복잡성에 따라 다음 sed명령으로 충분할 수 있습니다.

sed -n 's/^.*\(\<Foo=[^,]*\).*/\1/p'

이것은 유효한 예입니다

FIELD='Foo'
sed -n "s/^.*\(\<${FIELD}=[^,]*\).*/\1/p' << xxEOFxx
Foo=1, Bar=2, Baz=3
Bar=4, Foo=2, Baz=3
Bar=42, Baz=42, Foo=3
xxEOFxx
Foo=1
Foo=2
Foo=3

답변4

grep사용할 수 있는 옵션이 없는 경우 -o다음 방법도 사용할 수 있습니다.

sed -e 's/, /\n/g' | grep '^Foo='

이는 sed각 쉼표 + 공백을 줄 바꿈(각 키-값 쌍을 자체 줄로 분할)으로 바꾼 다음 grep을 사용하여 "Foo" 키만 검색하는 것입니다.

테스트 사례:

printf "%s\n" "Foo=1, Bar=2, Baz=3" "Bar=4, Foo=2, Baz=3" "Bar=42, Baz=42, Foo=3" \
    | sed -e 's/, /\n/g' | grep '^Foo='

관련 정보