用换行符分隔的xargs


40

是否可以xargs使用换行符作为分隔符?(如果重要的话,请在Linux和OS X上使用bash)

我知道-0可以使用,但是它是PITA,因为不是每个命令都支持NUL分隔的输出。


您要完成的任务是什么。可能还有另一种解决方法。
丹尼斯·威廉姆森

@Dennis我将它用于各种用途,通常与grep,sed,非常基本的awk等一起使用,主要用于并行执行。 find -print0 -name \*.foo -maxdepth 1 | xargs -0 -P4与相比,实在太多了ls *.foo | xargs -P4
Kornel

脚本和函数是减少键入的两种出色方法。
丹尼斯·威廉姆森

这是一个特别的问题,不是吗?
查尔斯·斯图尔特

Answers:


17

遵循以下原则

alias myxargs='perl -p -e "s/\n/\0/;" | xargs -0'
cat nonzerofile | myxargs command

应该管用。


38
tr '\n' '\0'也可以。
Kornel

2
对于单个角色,perl会显得过分杀伤力。tr对于CPU和手指而言,速度都更快。
世界

52

支持GNU xargs(在Linux上默认;findutils在OS X上从MacPorts 安装)以获得支持,您可以为输入-d指定自定义定界符,从而可以

ls *foo | xargs -d '\n' -P4 foo 

alias xxargs="xargs -d '\n'"在我的bashrc中。所以我可以做这样的事情:grep -IRl foo | xxargs sed -i s/foo/bar/g
tylerl 2011年

4
这确实应该是公认的答案。无需打破perl。虽然tr也是个好主意。
Ehtesh Choudhury 2012年

3
brew install findutilsgxargs正是我需要什么样的OS X,谢谢。
Brad Koch

5

使用Bash时,我通常更喜欢避免xargs来解决任何棘手的问题,而支持while读取循环。对于您的问题,while read -ar LINE; do ...; done该工作是否可行(请记住对LINE使用数组语法,例如${LINE[@]}对于整行)。这不需要任何技巧:默认情况下,read的用法\n与行终止符相同。

我应该在SO上发布有关xargs与while-read循环的优缺点的问题... 完成!


2
这只能模仿xargs -n1 -d'\n',而不能整体模仿xargs
Hello World

@HelloWorld-您可以轻松地将参数组合在一起,因此xargs -n$N只需少量的额外脚本即可进行模拟。
查尔斯·斯图尔特

是的,我是支持者之一,这只是一句话值得一提。
世界你好

这正是我的工作!另外,您可以使用这些read选项,例如在单独的变量中读取更多单词,或使用更改定界符IFS=' '
caesarsol

0

不适用于标准版本。我有一个经过破解的版本,可以在不了解' find ... -print0 | xargs -0 ...'的情况下使用它。如果您需要副本,请与我联系-查看我的个人资料。(没有火箭科学-但这只是完成这项工作。它不是完整的xargs副本。)


0

关于什么的cat file | xargs | sed 's/ /\n/ig',这将空间转换为换行符,使用标准的Linux bash的工具。


如果file包含空格和换行,则此命令的结果将使其无法区分它们,这似乎在什么这个问题的相反的方向发展请求
最大Nanasy
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.