GNU grep を使用:
echo 'Hi! Hi, same word twice twice, as as here here! ! ,123 123 need' | grep -Eo '(\b.+) \1\b'
出力:
twice twice as as here here 123 123
オプション :
-E
:(\b.+) \1\b
を解釈します 拡張正規表現として。
-o
:一致する行の一致した (空でない) 部分のみを出力し、そのような部分はそれぞれ別の出力行に出力します。
正規表現 :
\b
:ゼロ幅の単語境界です。
.+
:1 つ以上の文字に一致します。
\1
:括弧 ()
キャプチャ グループと \1
をマークします ここで最初のキャプチャ グループの値を使用することを意味します。
参照:スタック オーバーフローの正規表現に関するよくある質問
これはあなたが望むもののように思えます (すべての UNIX ボックスの任意のシェルで任意の awk を使用します):
$ cat tst.awk
BEGIN { RS=""; ORS="\n\n" }
{
head = prev = ""
tail = $0
while ( match(tail,/[[:alpha:]]+/) ) {
word = substr(tail,RSTART,RLENGTH)
head = head substr(tail,1,RSTART-1) (word == prev ? "" : word)
tail = substr(tail,RSTART+RLENGTH)
prev = word
}
print head tail
}
$ cat file
the quick quick brown
fox jumped jumped
jumped over the lazy
lazy dogs back
$ awk -f tst.awk file
the quick brown
fox jumped
over the lazy
dogs back
ただし、句読点、大文字と小文字の違い、複数の段落、文頭と文末の単語の重複、およびその他のさまざまな重要なケースが示されているなど、より真に代表的なサンプル入力と期待される出力を使用して、新しい質問をしてください。