Is it possible to make xargs use only newline as separator? (in bash on Linux and OS X if that matters)

I know -0 can be used, but it's PITA as not every command supports NUL-delimited output.

link|improve this question

75% accept rate
What is it that you're trying to accomplish. There may be another way to go about it. – Dennis Williamson Mar 31 '10 at 4:50
@Dennis I use it for various things, often in pipeline with grep, sed, very basic awk etc., mostly to parallelize execution. find -print0 -name \*.foo -maxdepth 1 | xargs -0 -P4 is way too much to type compared with ls *.foo | xargs -P4. – porneL Mar 31 '10 at 13:21
Scripts and functions are two excellent ways to reduce typing. – Dennis Williamson Mar 31 '10 at 13:49
This is an SO question, isn't it? – Charles Stewart Apr 1 '10 at 11:22
feedback

5 Answers

up vote 2 down vote accepted

Something along the lines of

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

should work.

link|improve this answer
3  
tr '\n' '\0' works too. – porneL Apr 5 '10 at 15:26
feedback

GNU xargs (default on Linux, install findutils from MacPorts on OS X to get it) supports -d which lets you specify a custom delimiter for input, so you can do

ls *foo | xargs -d '\n' -P4 foo 
link|improve this answer
I have alias xxargs="xargs -d '\n'" in my bashrc. So I can just do things like this: grep -IRl foo | xxargs sed -i s/foo/bar/g – tylerl Feb 13 '11 at 0:45
feedback

With Bash, I generally prefer to avoid xargs for anything the least bit tricky, in favour of while-read loops. For your question, while read -ar LINE; do ...; done does the job (remember to use array syntax with LINE, e.g., ${LINE[@]} for the whole line). This doesn't need any trickery: by default read uses just \n as the line terminator character.

I should post a question on SO about the pros & cons of xargs vs. while-read loops... done!

link|improve this answer
feedback

Not with the standard version. I have a hacked version that does that - I used it before I knew about 'find ... -print0 | xargs -0 ...'. Contact me if you want a copy - see my profile. (No rocket science - it just about does the job, though. It is not a complete xargs replica.)

link|improve this answer
feedback

I think you will find that GNU Parallel http://www.gnu.org/software/parallel/ solves both your problems with newline and with running jobs in parallel.

Watch the intro video: http://www.youtube.com/watch?v=OpaiGYxkSuQ

link|improve this answer
feedback

Your Answer

 
or
required, but never shown

Not the answer you're looking for? Browse other questions tagged or ask your own question.