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