grep은 문자열의 두 부분을 정확하게 일치시킵니다.

grep은 문자열의 두 부분을 정확하게 일치시킵니다.

아래와 같이 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과 일치하는 행을 린트합니다 ( 전역 적으로는 명령 이름을 따서 명명됨 ).regg/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"

관련 정보