2016-11-16 129 views
1

我试图运行一个命令,该命令可以被简化到这种结构:重定向标准输入/输出命令被取代

echo "A,B" | cp $(sed -e 's/A,//') $(sed -e 's/,B//') 

但是我奋力得到取代的命令右边的输入/输出。 运行上述代码产生此错误消息: sed的:在stdin读取错误:输入/输出错误

当运行此代替:

echo "A,B" | cp <(sed -e 's/A,//') <(sed -e 's/,B//') 

命令不会终止。

我在这里做错了什么?

回答

1

试试这个:

echo "A,B" | (IN=$(cat); cp $(echo $IN | sed -e 's/A,//') $(echo $IN | sed -e 's/,B//')) 

这将创建一个子shell并保存标准输入输入$IN变量。然后它在输入上运行2 sed命令,并使用输出作为cp的参数。

2

sed两个实例正在等待输入自己的标准输入,这是你的终端。管道连接到cp的标准输入,而不连接到sed实例中的任一个。

试试这个:

read first second <<< "A,B" 
cp "${first}" "${second}" 

,或者:

var="A,B" 
cp "${var%,*}" "${var#*,}" 
+0

我想有是一个一行,做以下工作: 取一个命令的输出,并处理多种不同的方式,并使用结果作为输入参数的另一个命令。 看起来'sed'实际上是获取输入,如: 'echo“123”| echo <$(sed -e's/2/4 /')' 返回:** zsh:没有这样的文件或目录:143 ** –

+0

这两个进程替换都从其中运行'cp'的shell继承它们的标准输入,所以'cp'和两个'sed'的三个都会从管道读取。 'cp'忽略标准输入,所以它取决于'sed'计划先运行的操作系统,并且能够读取传入的字符串。 – chepner