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):\"[^\"]*"'

마지막 진술을 추가해야 합니다 ". 또한 탈출할 필요가 없으므로 "다음을 사용할 수 있습니다.

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콘텐츠는 일반적으로 오프라인으로 추출되지 않습니다. p정규식과 일치하는 행을 인쇄합니다 (일반적으로 말하면 명령 이름을 따서 명명됩니다).regg/re/p ed

그러나 일부 구현(예 grep: 사용 중인 것으로 보이는 GNU)에는 -o이러한 기능 중 일부가 확장으로 필요합니다.

pcregrep더 나아가. -o행의 전체 일치 부분이 아닌 캡처링 그룹의 내용을 출력하기 위해 선택적 숫자 인수를 사용할 수 있습니다 .

pcregrep -o1 -o2 --om-separator=' ' '(red:"[^"]*").*(yellow:"[^"]*")'

할 수 있는 일에는 아직 한계가 있습니다.

줄에서 정보를 추출하고 더 많은 변환을 수행하려면 다른 사람들이 여기에 표시된 것처럼 대신 텍스트 s흐름을 사용해야 합니다 .ed

답변3

grep당신은 정말로 이것을 할 수 있습니다스파크호크가 제안한, 또는 거의 동일합니다.

$  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"

관련 정보