我正在尝试通过xargs
传递值列表。这是一个简单的示例:
echo "Hello Hola Bonjour" | xargs -I _ echo _ Landon
我希望它会输出以下内容:
Hello Landon
Hola Landon
Bonjour Landon
相反,命令输出以下内容:
Hello Hola Bonjour Landon
我想念什么?
答案 0 :(得分:5)
在-I
下,man xargs
说
不带引号的空格不会终止输入的项目;而是 分隔符是换行符
您可以指定其他定界符(至少在GNU xargs中):
printf 'Hello Hola Bonjour' | xargs -d' ' -I _ echo _ Landon
更可移植的是,使用\0
作为分隔符,使用-0
来使用它:
printf '%s\0' Hello Hola Bonjour | xargs -0 -I _ echo _ Landon
答案 1 :(得分:2)
需要更改定界符,并且还必须指定-L选项。因此,要么像建议的其他答案一样通过-d更改定界符,要么通过sed并用换行符替换空间
echo "Hello Hola Bonjour" | sed -e 's/ /\n/g' | xargs -L 1 -I _ echo _ Landon
结果
Hello Landon
Hola Landon
Bonjour Landon
有时更改分隔符是不够的。 xargs有时会接受所有输入参数,然后一次传递所有参数。参数没有分裂。
例如
seq 1 7 | xargs echo
产生
1
2
3
4
5
6
7
被传递给xargs,所以输出将是
1 2 3 4 5 6 7
如果您添加xargs手册页中显示的-L 1
-L最大行 每个命令行最多使用最大行数非空白输入行。尾随空白导致输入行 在下一个输入行上逻辑继续。表示-x。
seq 1 7 | xargs -L 1 echo
然后您将看到
1
2
3
4
5
6
7
您也可以将其手动隐藏到for循环中,从而使您可以更轻松地设置多行语句。
# be absolutely sure the values the for loop iterates over is well sanitized to avoid glob expansion of the *.
for i in Hello Hola Bonjour
do
if [ "$i" = "Hello" ]
then
echo "$i Landon, language detected as English!"
else
echo "$i Landon, language detected as non English."
fi
done
答案 2 :(得分:0)
-I标志将分隔符更改为换行符。
不带引号的空格不会终止输入的项目;相反,分隔符是换行符。
您可以阅读有关here的信息。
您必须手动将定界符指定为空格。默认情况下,Echo还插入一个换行符,使xargs混乱。使用-n标志删除换行符。
这是固定命令:
row