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입니다.