以换行符分隔的 xargs

以换行符分隔的 xargs

是否可以xargs利用仅有的换行符作为分隔符?(在 Linux 和 OS X 上的 bash 中如果有关系的话)

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

答案1

类似于

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

应该管用。

答案2

GNU xargs(Linux 上为默认;findutils在 OS X 上从 MacPorts 安装即可)支持-d它允许您指定自定义分隔符用于输入,因此你可以

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

答案3

使用 Bash 时,我通常倾向于避免使用 xargs 来处理任何稍微有点棘手的事情,而使用 while-read 循环。对于您的问题,while read -ar LINE; do ...; done这样做就可以了(请记住对 LINE 使用数组语法,例如,${LINE[@]}对整行)。这不需要任何技巧:默认情况下,read 仅用作\n行终止符。

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

答案4

请使用 xargs 的 -d 选项

  --delimiter=delim, -d delim

输入项以指定字符结尾。指定的分隔符可以是单个字符、C 样式字符转义符(如 \n)或八进制或十六进制转义码。八进制和十六进制转义码理解为 printf 命令。不支持多字节字符。处理输入时,引号和反斜杠不是特殊字符;输入中的每个字符都按字面意思理解。-d 选项禁用任何文件结束字符串,该文件结束字符串将像任何其他参数一样处理。当输入仅由换行符分隔的项组成时,可以使用此选项,尽管在可能的情况下,将程序设计为使用 --null 几乎总是更好的选择。

例子:

$ 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>

相关内容