인덱스로 지정된 두 단어 사이의 텍스트를 얻는 방법은 무엇입니까?

인덱스로 지정된 두 단어 사이의 텍스트를 얻는 방법은 무엇입니까?

awk를 사용하면 아래와 같이 색인이 주어진 단어를 인쇄할 수 있습니다.

$ echo "The quick brown fox jumps over the lazy dog" | awk  '{print $3, $7}'
brown the

하지만 지정된 단어 "brown"과 "the" 사이에 있는 텍스트도 가져오고 싶습니다. 그래서 나는 출력이 다음과 같기를 원합니다.

brown fox jumps over the

특별히 awk를 사용할 필요는 없지만 단어의 색인화 및 토큰화는 awk를 사용하는 나머지 쉘 스크립트와 일관성을 유지하기 위해 awk와 일치해야 합니다.

첫 번째 색인부터 마지막 ​​색인까지 단어를 인쇄하는 것을 고려했지만 단어 사이의 공백은 유지되지 않습니다.

복잡하지만 좀 더 정확하게 표현하기 위해, 색인으로 지정된 특정 단어의 시작 부분부터 시작하여 다른 색인으로 지정된 다른 단어의 끝 부분에서 끝나는 텍스트를 얻고 싶습니다. 이를 어떻게 달성할 수 있습니까(바람직하게는 bash 루프 없이)?

답변1

Pass 를 gawk사용하면 이 split()함수를 사용하여 필드와 해당 구분 기호를 결정할 수 있습니다.

$ echo "The quick brown fox   jumps over the lazy dog" | awk '{ split($0, a, "\\s+", s); for (i = 3; i <= 7 && i <= length(a); i++) printf "%s%s", a[i], (i < 7 ? s[i] : "\n") }'
brown fox   jumps over the

답변2

그리고perl

$ echo "The quick brown fox   jumps over the lazy dog"  | perl -F'(\h+)' -lane 'print @F[4..12]'
brown fox   jumps over the
  • -F'(\h+)'공백/탭으로 분할, 구분 기호도 저장
  • print @F[4..12]필요한 색인을 인쇄하십시오. perl배열 인덱스는 다음으로 시작하며 0구분 기호도 고려해야 합니다. 간단한 규칙은 1을 빼고 2를 곱하는 것입니다. 따라서 (3-1)*2=4이고 (7-1)*2=12입니다.

관련 정보