아래와 같이 grep 명령을 사용하여 문자열의 일부를 얻으려면 어떻게 해야 합니까?
끈:
orange:"orange", red:"apple", purple:"grape", yellow:"banana", green:"watermelon"
red:"strawberries", yellow:"lemon"
내가 원하는 것:
red:"apple" yellow:"banana"
red:"strawberries" yellow:"lemon"
나는 이것을 시도했습니다 :
grep -oP '(red:\"[^\"]*).*(yellow:\"[^\"]*)'
답변1
.*
가운데는 모든 것, 즉 부품과 일치 합니다 purple:"grape"
. 대신(GNU grep을 계속 사용한다고 가정하면) (foo|bar)
"OR" 구조를 사용하여 각 부분을 개별적으로 일치시킵니다 .
grep -oP '(red|yellow):\"[^\"]*"'
NB 나는 종결을 추가해야 했습니다 "
. 또한 을 탈출할 필요가 없으므로 "
다음을 사용할 수 있습니다.
grep -oP '(red|yellow):"[^"]*"'
어쨌든 이것은 당신에게 제공됩니다
red:"apple"
yellow:"banana"
그런 다음 선 사이에 공백을 두고 선을 연결하려면
grep -oP '(red|yellow):"[^"]*"' | paste -sd ' ' -
솔직히, 나는 자연스럽게 sed
대신 사용할 것입니다.
sed -n 's/.*\(red:"[^"]*"\).*\(yellow:"[^"]*"\).*/\1 \2/p'
답변2
grep
일반적으로 콘텐츠를 오프라인으로 추출하지 않습니다. 일반 xpression p
과 일치하는 행을 린트합니다 ( 전역 적으로는 명령 이름을 따서 명명됨 ).r
e
g
g/re/p
ed
grep
그러나 당신이 사용하고 있는 것으로 보이는 GNU와 같은 일부 구현은 -o
그 중 일부를 확장으로 수행합니다.
pcregrep
더욱 나아갑니다. 행 -o
의 전체 일치 부분이 아닌 캡처 그룹의 내용을 출력하기 위해 선택적 숫자 인수를 사용할 수 있습니다.
pcregrep -o1 -o2 --om-separator=' ' '(red:"[^"]*").*(yellow:"[^"]*")'
아직까지는 할 수 있는 일이 제한되어 있습니다.
줄에서 정보를 추출하고 더 많은 변환을 수행하려면 다른 사람들이 여기에 표시된 것처럼 대신 원하는 텍스트 s
트리터 입니다.ed
답변3
grep
실제로 as 로 할 수 있습니다스파호크가 제안한, 또는 거의 동일합니다.
$ echo 'red:"apple", purple:"grape", yellow:"banana"' |
grep -oP '(red|yellow):".+?"' | perl -00pe 's/\n/ /'
red:"apple" yellow:"banana"
개인적으로 나는 아마도 다음과 같이 할 것입니다 perl
.
$ echo 'red:"apple", purple:"grape", yellow:"banana"' |
perl -F, -ane 'map{print if /red|yellow/}@F'
red:"apple" yellow:"banana"