将 echo 输出传送到 xargs

问题描述 投票:0回答:3

我正在尝试通过

xargs
传输值列表。这是一个简单的例子:

echo "Hello Hola Bonjour" | xargs -I _ echo _ Landon

我希望它输出以下内容:

Hello Landon
Hola Landon
Bonjour Landon

相反,该命令输出以下内容:

Hello Hola Bonjour Landon

我错过了什么?

bash xargs
3个回答
9
投票

-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

6
投票

-I
标志将分隔符更改为换行符。

不带引号的空格不会终止输入项;相反,分隔符是换行符。

您可以在此处阅读相关内容。

您必须手动将分隔符指定为空格。 Echo 默认情况下还会插入换行符,这会搞乱

xargs
。使用
-n
标志删除换行符。

这是固定命令:

echo -n "Hello Hola Bonjour" | xargs -d' ' -I _ echo _ Landon

4
投票

需要更改分隔符,并且还必须指定-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
© www.soinside.com 2019 - 2024. All rights reserved.