默认情况下,xargs将连接其输入的许多行,然后传递给指定的命令。例如:
echo -e 'line 1\nline 2\nline 3' | xargs echo
Run Code Online (Sandbox Code Playgroud)
结果是
line 1 line 2 line 3
Run Code Online (Sandbox Code Playgroud)
由于参数被发送到单个 echo 命令(在命令行长度的限制内)。
有时您想使用替换字符串将参数放在命令中的其他位置,而不是末尾:
echo -e 'line 1\nline 2\nline 3' | xargs -Ix echo x DONE
line 1 DONE
line 2 DONE
line 3 DONE
Run Code Online (Sandbox Code Playgroud)
现在,xargs 每次 echo 调用只替换一个参数,因为正如手册页所说“-I 意味着 -L 1...”。这可能是典型情况下的正确行为,但是有什么方法可以覆盖它,以便我得到line 1 line 2 line 3 DONE输出吗?
请注意,我的示例只是说明性的 - 我对解决此问题的非 xargs 方法不太感兴趣。
我不知道有什么xargs选项可以做到这一点,但您可以通过调用来实现类似的效果bash -c:
$ echo -e "line 1\nline 2\nline 3" | xargs bash -c 'echo "${@}" DONE' _
line 1 line 2 line 3 DONE
Run Code Online (Sandbox Code Playgroud)
请注意,即使您指定 ,xargs也不提供行-L作为参数。您可能想使用-d换行符来分隔项目(我相信仅限 gnu xargs)。对比如下:
$ echo -e "line 1\nline 2\nline 3" |
xargs bash -c 'printf "<%s>\n" "${@}" DONE' _
<line>
<1>
<line>
<2>
<line>
<3>
<DONE>
$ echo -e "line 1\nline 2\nline 3" |
xargs -d\\n bash -c 'printf "<%s>\n" "${@}" DONE' _
<line 1>
<line 2>
<line 3>
<DONE>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4476 次 |
| 最近记录: |