【问题标题】:Is it possible to combine two tr commands into one?是否可以将两个 tr 命令合并为一个?
【发布时间】:2018-11-08 04:07:08
【问题描述】:

我有以下两个命令:

tr '[:upper:]' '[:lower:]' < file1.txt > file2.txt
tr -s "[:punct:]" " " < file1.txt > file2.txt

是否可以将它们组合成一个命令?我的以下尝试没有奏效:

tr '[:upper:]' '[:lower:]' | tr -s "[:punct:]" " " < file1.txt > file2.txt

【问题讨论】:

  • 当通过管道命令使用重定向时,输入重定向应该应用于管道中的第一个命令,并且输出 重定向 - 到 最后一条命令tr ... &lt; file1.txt | tr -s ... &gt; file2.txt.

标签: linux shell ubuntu tr


【解决方案1】:

您需要将输入重定向放在第一个 tr 之前,而不是第二个。

tr '[:upper:]' '[:lower:]' < file1.txt | tr -s "[:punct:]" " " > file2.txt

否则,第一个tr 尝试从终端而不是文件读取,第二个tr 从文件而不是管道读取。

【讨论】:

    【解决方案2】:

    tr 不允许在单个命令行调用上运行多个操作。您将在管道中分叉两个tr 进程,以便能够实现您想要做的事情。但是如果你可以使用sed(GNU 版本),你可以在一次操作中完成

    sed 's/\([A-Z]*\)/\L\1/;s/\([[:punct:]]*\)//g' file1.txt
    

    【讨论】:

      【解决方案3】:

      您可以仅使用最后一个命令来组合这两个命令(因为第一个命令的输出无论如何都会被丢弃 - 这两个命令都读取和写入相同的文件)。

      【讨论】:

        猜你喜欢
        • 2015-06-19
        • 1970-01-01
        • 1970-01-01
        • 2011-06-03
        • 1970-01-01
        • 1970-01-01
        • 2021-10-12
        • 2015-06-08
        • 2010-10-08
        相关资源
        最近更新 更多