将回显输出到xargs

时间:2018-08-07 23:09:43

标签: bash xargs

我正在尝试通过xargs传递值列表。这是一个简单的示例:

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

我希望它会输出以下内容:

Hello Landon
Hola Landon
Bonjour Landon

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

Hello Hola Bonjour Landon

我想念什么?

3 个答案:

答案 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