假设我有一些命令的输出(比如ls -1):

a
b
c
d
e
...

我想依次对每一个应用一个命令(比如echo)。如。

echo a
echo b
echo c
echo d
echo e
...

在bash中最简单的方法是什么?


当前回答

您实际上可以使用sed来实现,前提是它是GNU sed。

... | sed 's/match/command \0/e'

工作原理:

用命令匹配替换匹配 关于替换执行命令 用命令输出替换被替换的行。

其他回答

一个解决方案,工作的文件名中有空格,是:

ls -1 | xargs -I %s echo %s

下面是等价的,但是前体和你实际想做的事情之间有一个更清晰的界限:

ls -1 | xargs -I %s -- echo %s

其中echo是你想要运行的任何东西,后面的%s是文件名。

感谢Chris Jester-Young对一个重复问题的回答。

for s in `cmd`; do echo $s; done

如果cmd有一个大的输出:

cmd | xargs -L1 echo

对我来说更好的结果是:

ls -1 | xargs -L1 -d "\n" CMD

例如,我喜欢使用gawk在一个列表上运行多个命令

ls -l | gawk '{system("/path/to/cmd.sh "$1)}'

然而,可转义字符的转义可能会有点麻烦。

使用xargs可能是最简单的。在你的情况下:

ls -1 | xargs -L1 echo

-L标志确保正确读取输入。从xargs的手册页:

-L number
    Call utility for every number non-empty lines read. 
    A line ending with a space continues to the next non-empty line. [...]