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.
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.
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
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 00:45
tr is a good idea too.
– Ehtesh Choudhury
Dec 03 '12 at 18:36
brew install findutils and gxargs was exactly what I needed on OS X, thanks.
– Brad Koch
Mar 22 '16 at 19:00
Something along the lines of
alias myxargs='perl -p -e "s/\n/\0/;" | xargs -0'
cat nonzerofile | myxargs command
should work.
tr is faster both for the cpu and for your fingers.
– Hello World
Apr 23 '15 at 20:09
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!
xargs -n$N as well with only a bit of extra scripting.
– Charles Stewart
May 05 '15 at 16:33
read options, like reading more words in separate variables, or change delimiter with IFS=' '.
– caesarsol
Mar 13 '17 at 14:14
$IFS (normally whitespace), and concatenating the array with ${LINE[*]} or ${LINE[@]} does not restore that original whitespace. Using while read -r line; do ... is better for most situations, and lowercase variables avoid conflict with built-in/environment variables.
– Walf
Oct 26 '21 at 02:56
-d '\n' will fail if you simply want to package up each line of the file as a single argument to the same command?
– Michael
Apr 20 '23 at 22:56
$ echo "1\n2 3\n4 5 6" | xargs -L1 echo "#"
# 1
# 2 3
# 4 5 6
echo is xarg's default command, you can just do echo "..." | xargs -L1.
– Matt Alexander
Nov 23 '22 at 10:59
please use the -d option of xargs
--delimiter=delim, -d delimInput items are terminated by the specified character. The specified delimiter may be a single character, a C-style character escape such as \n, or an octal or hexadecimal escape code. Octal and hexadecimal escape codes are understood as for the printf command. Multibyte characters are not supported. When processing the input, quotes and backslash are not special; every character in the input is taken literally. The -d option disables any end-of-file string, which is treated like any other argument. You can use this option when the input consists of simply newline-separated items, although it is almost always better to design your program to use --null where this is possible.
Example:
$ echo 'for arg in "$@"; do echo "arg: <$arg>"; done' > show_args
$ printf "a a\nb b\nc c\n"
a a
b b
c c
$ printf "a a\nb b\nc c\n" | xargs -d '\n' bash show_args
arg: <a a>
arg: <b b>
arg: <c c>
What about cat file | xargs | sed 's/ /\n/ig' this will convert spaces to newlines, using standard Linux bash tools.
file contains spaces and newlines, then the result of this command will make it impossible to distinguish between them, which seems to be going in the opposite direction of what this question asks for
– Max Nanasy
Sep 24 '18 at 19:07
find -print0 -name \*.foo -maxdepth 1 | xargs -0 -P4is way too much to type compared withls *.foo | xargs -P4. – Kornel Mar 31 '10 at 13:21