管道回声输出到 xargs

Piping echo output into xargs

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

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

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

Hello Landon
Hola Landon
Bonjour Landon

相反,该命令输出如下:

Hello Hola Bonjour Landon

我错过了什么?

需要更改分隔符,还必须指定-L 选项。因此,要么像建议的其他答案一样通过 -d 更改分隔符,要么通过管道传输到 sed 并将 space 替换为 linefeed

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 Use at most max-lines nonblank input lines per command line. Trailing blanks cause an input line to be logically continued on the next input line. Implies -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

-I下,man xargs

unquoted blanks do not terminate input items; instead the separator is the newline character

您可以指定不同的分隔符(至少在 GNU xargs 中):

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

更便携,使用[=14=]作为分隔符,-0使用它:

printf '%s[=11=]' Hello Hola Bonjour | xargs -0 -I _ echo _ Landon

-I 标志将定界符更改为换行符。

Unquoted blanks do not terminate input items; instead the separator is the newline character.

你可以阅读它 here

您必须手动将分隔符指定为 space。 Echo 还默认插入一个换行符,这会弄乱 xargs。使用 -n 标志删除换行符。

固定命令如下:

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