Bash 将回波输出管道化到xargs
我正试图通过Bash 将回波输出管道化到xargs,bash,xargs,Bash,Xargs,我正试图通过xargs传递一个值列表。下面是一个简单的例子: echo "Hello Hola Bonjour" | xargs -I _ echo _ Landon 我预计这将产生以下结果: Hello Landon Hola Landon Bonjour Landon 相反,该命令输出以下内容: Hello Hola Bonjour Landon 我缺少什么?需要更改分隔符,还必须指定-L选项。因此,要么像另一个答案建议的那样通过-d更改分隔符,要么将管道改为sed并用换行符替换空格
xargs
传递一个值列表。下面是一个简单的例子:
echo "Hello Hola Bonjour" | xargs -I _ echo _ Landon
我预计这将产生以下结果:
Hello Landon
Hola Landon
Bonjour Landon
相反,该命令输出以下内容:
Hello Hola Bonjour 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有时会获取所有输入参数并一次传递所有参数。争论不存在分裂
e、 g
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
那你就会明白了
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
下,人xargs
说
不带引号的空格不终止输入项;而是
分隔符是换行符
您可以指定不同的分隔符(至少在GNU xargs中):
更便于携带的是,使用\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
echo“Hello Hola Bonjour”| xargs printf“%s Landon\n”
(由于printf
在看到额外参数时重用其格式字符串,printf“%s Landon\n”Hello Hola Bonjour
将打印您期望的三行)。一般来说,xargs-I
是最好避免的;它在应用于常见用例时存在严重的(安全)问题(如替换为sh-c'…'
strings)。对macOS有什么建议吗?-d
标志不可用。@LandonSchropp…通常,最好的做法是使用NUL分隔符,而不是空格或换行符:printf“%s\0”你好,你好,你好,你好,xargs-0-I_uuu.echo_uuu.Landon
。NUL是C字符串(文件名等)中唯一不能存在的字符,因此它是唯一保证用于分隔任意字符串安全的东西;并且xargs-0
在MacOS上可用。@LandonSchropp Mac有基本上不可移植的BSD工具。您可以安装更便携的GNU版本,该版本brew安装findutils
。有一些额外的细节。
printf '%s\0' Hello Hola Bonjour | xargs -0 -I _ echo _ Landon
echo -n "Hello Hola Bonjour" | xargs -d' ' -I _ echo _ Landon