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