Unix Terminal - 各バイナリ/三項を1行に印刷する方法は?

Unix Terminal - 各バイナリ/三項を1行に印刷する方法は?

Unix端末を使用して1行の各タプルを印刷するには?句読点は「単語」と見なされます。

たとえば、次のように入力する必要がある場合:

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

部分行を印刷できるだけでなく、(一致する行ではなく一致するもののみを印刷するオプションを持つgrepgrepなど)、部分行も印刷できる実装が必要です。-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

関連情報