如何使用提示符将 Diff 命令转换为 bash 脚本

如何使用提示符将 Diff 命令转换为 bash 脚本

我有一个已复制的列表,我想将其粘贴到 shell 中以仅提供重复的行。

1

1

3

2

当我读到 bash 命令时,我做了这个:

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

当我编写上述命令时,我粘贴我的列表并按CTRL+Z停止 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

第一个问题是控制 Z,在标准设置中,它会暂停作业,使其在后台不运行。您会在退出时注意到这一点,这会告诉您您已经停止了作业。 (其他作业控制命令也可能)您想要的是 Control D,当在终端键入时会发送文件结尾。这一点与dos和windows有很大不同。

其次,当您在脚本中看到 cat 时,90% 的情况下都不需要它。有三种方法可以在不使用 cat 的情况下完成您想要做的事情:

  1. teetee /tmp/sortme | sort | diff - <(sort -u /tmp/sortme) 您还可以用命名链接替换临时文件。

  2. 使用 uniq -dsort | uniq -d

  3. xclip 允许您从命令行访问剪贴板,因此您不必发送 EOF。它还可以与前面的两个选项结合使用,以便所有这四个行都可以执行您想要的操作。

    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
    

相关内容