プロンプトを使用してDiffコマンドをbashスクリプトに変換する方法

プロンプトを使用してDiffコマンドをbashスクリプトに変換する方法

重複した行のみを提供するためにシェルに貼り付けたいコピーリストがあります。

1

1

サム

2

bashコマンドを読んだとき、私は次のようにしました。

cat > /tmp/sortme ; diff <(sort /tmp/sortme) <(sort -u /tmp/sortme)

上記のコマンドを作成するときにリストを貼り付けてCTRL+Zstop catを押すと、重複した行が表示されます。ファイルを比較したくなく、数行の入力だけを貼り付けてください。

今質問は:このコマンドをスクリプトに変換する方法はありますか?なぜならスクリプトで作ってCTRL+Z止めようとする時です。

PS:笑わないでください。初めて試してみてください。今まで勉強を続けています。 :)

答え1

#!/bin/bash

while :
do
  echo Paste some input, then press Control-D:
  cat > /tmp/sortme ; diff <(sort /tmp/sortme) <(sort -u /tmp/sortme)
done

答え2

最初の問題は、標準設定でタスクがバックグラウンドで実行されないように一時停止するControl Zです。終了するとこれがわかります。これはジョブが停止したことを示します。 (他のジョブ制御コマンドも可能です。)必要なのは、端末に入力したときにファイルの終わりを送信するコントロールDです。これはdosとwindowsとは非常に異なります。

第二に、スクリプトでcatを見ると、90%の場合には必要ありません。 catを使わずに好きなことをする3つの方法があります。

  1. teetee /tmp/sortme | sort | diff - <(sort -u /tmp/sortme) 一時ファイルを名前付きリンクに置き換えることもできます。

  2. uniq -dを使うsort | uniq -d

  3. xclipを使用すると、コマンドラインからクリップボードにアクセスできるため、EOFを送信する必要はありません。また、前の 2 つのオプションと組み合わせて、4 行とも目的の操作を実行できます。

    xclip -o > /tmp/sortme ; diff <(sort /tmp/sortme) <(sort -u /tmp/sortme)
    diff <(xclip -o|sort) <(xclip -o|sort -u)
    xclip -o|tee  /tmp/sortme | sort | diff - <(sort -u /tmp/sortme)
    xclip -o|sort | uniq -d
    

関連情報