如何将shell命令应用于命令输出的每一行?

Ale*_*ski 177 bash

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

a
b
c
d
e
...
Run Code Online (Sandbox Code Playgroud)

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

echo a
echo b
echo c
echo d
echo e
...
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*zek 198

这可能是最容易使用的xargs.在你的情况下:

ls -1 | xargs -L1 echo
Run Code Online (Sandbox Code Playgroud)

  • `ls`在管道中自动执行`-1`. (23认同)
  • 我希望这个答案包括对-L1的解释。 (7认同)
  • `xargs`只能运行可执行文件,而不能运行shell函数或shell内置命令.对于前者,最好的解决方案可能是在循环中使用`read`的解决方案. (6认同)
  • @Dennis,看起来不像:`ls | xargs -L2 echo`和`ls -1 | xargs -L2 echo`给出两个不同的输出.前者全都在一条线上. (5认同)
  • **-L, --max-lines=MAX-LINES** 每个命令行最多使用 MAX-LINES 个非空白输入行。- 意味着带有 -L1 的 xargs 将每次执行_消耗_一行命令。 (5认同)
  • @Alex:我得到相同的输出. (2认同)

Tre*_*ner 150

您可以在每一行上使用基本的前置操作:

ls -1 | while read line ; do echo $line ; done
Run Code Online (Sandbox Code Playgroud)

或者您可以将输出传递给sed以进行更复杂的操作:

ls -1 | sed 's/^\(.*\)$/echo \1/'
Run Code Online (Sandbox Code Playgroud)

  • 引用while循环中的"$ line",以避免单词分裂. (5认同)
  • 尝试使用`read -r line`来防止`read`搞乱转义字符.例如`echo'"a \"嵌套\"引用"'| 读线; 回声"$ line"; 完成`给出了"一个"嵌套的"引用",它已经失去了它的逃逸.如果我们做`echo'"一个"嵌套的"引用"'| 读取-r线; 回声"$ line"; 完成`我们得到`"一个"嵌套\"引用"`按预期.见http://wiki.bash-hackers.org/commands/builtin/read (3认同)

bal*_*ton 12

适用于包含空格的文件名的解决方案是:

ls -1 | xargs -I %s echo %s
Run Code Online (Sandbox Code Playgroud)

以下内容是等效的,但在前体和您实际想要做的事情之间有更清晰的划分:

ls -1 | xargs -I %s -- echo %s
Run Code Online (Sandbox Code Playgroud)

哪里echo是你要运行的东西,后面%s是文件名。

感谢Chris Jester-Young重复问题回答


Mic*_*yan 8

你可以使用for循环:

for file in * ; do
   echo "$file"
done

请注意,如果有问题的命令接受多个参数,那么使用xargs几乎总是更有效率,因为它只需要生成一次有问题的实用程序而不是多次.


Łuk*_*luk 8

你实际上可以使用sed来做它,只要它是GNU sed.

... | sed 's/match/command \0/e'
Run Code Online (Sandbox Code Playgroud)

这个怎么运作:

  1. 用命令匹配替换匹配
  2. 在替换执行命令
  3. 用命令输出替换替换行.


Mar*_*tos 5

for s in `cmd`; do echo $s; done
Run Code Online (Sandbox Code Playgroud)

如果cmd具有较大的输出:

cmd | xargs -L1 echo
Run Code Online (Sandbox Code Playgroud)

  • 如果`cmd`在其输出中有空格,则第一个将失败。 (6认同)
  • http://mywiki.wooledge.org/DontReadLinesWithFor、http://mywiki.wooledge.org/BashPitfalls 条目 #1 (2认同)