Unix Terminal - 각 바이너리/삼항을 한 줄에 인쇄하는 방법은 무엇입니까?

Unix Terminal - 각 바이너리/삼항을 한 줄에 인쇄하는 방법은 무엇입니까?

유닉스 터미널을 사용하여 한 줄의 각 튜플을 인쇄하는 방법은 무엇입니까? 구두점은 "단어"로 간주됩니다.

예를 들어, 다음을 입력해야 한다면:

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

죄송합니다. 이 목적은, 아니요:

~을 위한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(조건부 분기).:as///

게다가마이크의sedbigram.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

관련 정보