是否可以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>