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
정규식과 일치하는 행을 인쇄합니다 (일반적으로 말하면 명령 이름을 따서 명명됩니다).r
e
g
g/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"