我正在尝试通过
xargs
传输值列表。这是一个简单的例子:
echo "Hello Hola Bonjour" | xargs -I _ echo _ Landon
我希望它输出以下内容:
Hello Landon
Hola Landon
Bonjour Landon
相反,该命令输出以下内容:
Hello Hola Bonjour Landon
我错过了什么?
在
-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
-I
标志将分隔符更改为换行符。
不带引号的空格不会终止输入项;相反,分隔符是换行符。
您可以在此处阅读相关内容。
您必须手动将分隔符指定为空格。 Echo 默认情况下还会插入换行符,这会搞乱
xargs
。使用 -n
标志删除换行符。
这是固定命令:
echo -n "Hello Hola Bonjour" | xargs -d' ' -I _ echo _ Landon
需要更改分隔符,并且还必须指定-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 最大行数 每个命令行最多使用 max-lines 非空白输入行。 尾随空白会导致输入行 逻辑上继续下一个输入行。 意味着 -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