유닉스 터미널을 사용하여 한 줄의 각 튜플을 인쇄하는 방법은 무엇입니까? 구두점은 "단어"로 간주됩니다.
예를 들어, 다음을 입력해야 한다면:
This is ! line .
This is ! second line .
각 튜플을 검색하면 출력은 다음과 같아야 합니다.
This is
is !
! line
line .
This is
is !
! second
second line
line .
각 트리플을 검색하면 출력은 다음과 같아야 합니다.
This is !
is ! line
! line .
this is !
is ! second
! second line
second line .
주문하다
grep -Eio '[a-z!.]+ [a-z!.]+'
상품을 반품하다
This is
! line
This is
! second
line .
이것은 가깝지만 내가 필요한 것은 아닙니다.
답변1
Perl을 이렇게 사용할 수 있습니다
2튜플
perl -lne 'while(/(\S+\s+\S*){1}/){print $&;s/\S+\s+//}' file
This is
is !
! line
line .
This is
is !
! second
second line
line .
육각형
perl -lne 'while(/(\S+\s+\S*){2}/){print $&;s/\S+\s+//}' file
This is !
is ! line
! line .
This is !
is ! second
! second line
second line .
중괄호 안의 숫자를 원하는 행당 숫자(-1)로 변경합니다.
답변2
부분 줄을 인쇄할 수 있을 뿐만 아니라( 일치하는 줄이 아닌 일치하는 항목만 인쇄하는 옵션이 grep
있는 grep과 같은) 부분 줄도 인쇄할 수 있는 구현이 필요합니다 .-o
여러번.
pcregrep
중 하나이다:
pcregrep -o1 -o2 --om-separator=' ' '(\S+)\s*(?=(\S+))'
여기서는 -o2
그 자체로 일치하지 않는 것, 오직 일치하는 것,시야연산자( (?=...)
)를 사용하므로 pcregrep
출력 단어 끝부터 시작하여 더 많은 일치 항목을 계속 찾습니다 -o1
.
\s
간격(세로 또는 가로) 문자와 일치하므로성격이 경우 공백이 아닌 문자의 시퀀스입니다.
대신 다음을 사용할 수 있습니다 awk
.
awk '{for (i=1; i<NF; i++) print $i, $(i+1)}'
을 위한 awk
,성격일부 구현에서는 SPC 및 TAB로 제한되는 공백이 아닌(가로 간격) 문자의 시퀀스입니다.
line.
2개로 분리해서 생각 하고 싶다면성격: 그리고 다음 스키마를 기반으로 필드 정의를 지원하는 GNU 구현을 line
사용할 수 있습니다 ..
awk
gawk -v FPAT='[[:alnum:]]+|[[:punct:]]+' '{for (i=1; i<NF; i++) print $i, $(i+1)}'
어디성격일련의 영숫자 문자 또는 일련의 구두점 문자로 정의됩니다.
답변3
죄송합니다. 이 목적은sed, 아니요grep:
~을 위한2튜플:
sed 'h;:a;s/^ *\([^ ]\+\) \+\([^ ]\+\).*$/\1 \2/p;g;s/^ *[^ ]\+//;h;ta;'
아니면 아마도 ( as \+
로 대체\{1,\}
Stefan Chazeras의 검토지적했다:
sed -e 'h;:a' -e 's/^ *\([^ ]\{1,\}\) \{1,\}\([^ ]\{1,\}\).*$/\1 \2/p;g;s/^ *[^ ]\{1,\}//;h;ta'
그리고육각형:
sed 'h;:a;s/^ *\([^ ]\+\) \+\([^ ]\+\) \+\([^ ]\+\).*$/\1 \2 \3/p;g;s/^ *[^ ]\+//;h;ta;'
Mac 시스템의 경우 sed
:
sed -e 'h;:a' -e 's/^ *\([^ ]\{1,\}\) \{1,\}\([^ ]\{1,\}\) \{1,\}\([^ ]\{1,\}\).*$/\1 \2 \3/p;g;s/^ *[^ ]\{1,\}//;h;ta'
설명하다:
바이그램sed 스크립트로:
#!/bin/sed -f
h; # Hold pattern space to hold space
:a; # label for branch
s/^ *\([^ ]\+\) \+\([^ ]\+\).*$/\1 \2/p; # print 1st bigram
g; # restore from hold space
s/^ *[^ ]\+//; # drop 1st monogram
h; # hold pattern space
ta; # branch if last search success
마지막 항목이 일치 하는 경우에만 마지막 항목을 표시합니다 t
(조건부 분기).:a
s///
게다가마이크의sed
bigram.sed 버전:
#!/usr/bin/sed -f
h; # Hold pattern space to hold space
# label for branch
:a
s/^ *\([^ ]\{1,\}\) \{1,\}\([^ ]\{1,\}\).*$/\1 \2/p; # print 1st bigram
g; # restore from hold space
s/^ *[^ ]\{1,\}//; # drop 1st monogram
h; # hold pattern space
# branch if last search success
ta