我有一个已复制的列表,我想将其粘贴到 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 的情况下完成您想要做的事情:
tee
tee /tmp/sortme | sort | diff - <(sort -u /tmp/sortme)
您还可以用命名链接替换临时文件。使用 uniq -d
sort | uniq -d
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