换行符分隔的 xargs

Kor*_*nel 58 linux bash xargs

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

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

Jam*_*mes 69

GNU xargs(Linux 上的默认值;findutils从 OS X 上的 MacPorts安装以获取它)支持-d允许您为输入指定自定义分隔符,因此您可以执行

ls *foo | xargs -d '\n' -P4 foo 
Run Code Online (Sandbox Code Playgroud)

  • 这确实应该是公认的答案。无需打破 perl。虽然`tr`也是一个好主意。 (6认同)
  • `brew install findutils` 和 `gxargs` 正是我在 OS X 上所需要的,谢谢。 (5认同)

小智 22

类似的东西

alias myxargs='perl -p -e "s/\n/\0/;" | xargs -0'
cat nonzerofile | myxargs command
Run Code Online (Sandbox Code Playgroud)

应该管用。

  • `tr '\n' '\0'` 也可以。 (54认同)
  • perl 对单个字符来说太过分了。`tr` 对 CPU 和手指来说都更快。 (3认同)
  • 当你知道的唯一工具是放射性衰变时,一切看起来都像核反应堆 (3认同)

Cha*_*art 6

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

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

  • 这只能模拟`xargs -n1 -d'\n'`,而不是整个`xargs`。 (2认同)

cmc*_*nty 5

$ echo "1\n2 3\n4 5 6" | xargs -L1 echo  "#"
# 1
# 2 3
# 4 5 6
Run Code Online (Sandbox Code Playgroud)