管道回声输出到 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
我正在尝试通过 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