我正在尝试从输出构建URL,每行只有一个条目。我已经尝试过了:
<stuff> | xargs -L1 -I {} echo "${url}&page=queryresults&j="{}
但是,对于某些长行(它们没有空格,但可以有破折号和下划线),我得到了“ {}”,我希望在其中由<stuff>
生成的字符串。如果我在最后的双引号和{}之间添加一个空格,则可以使用,但是我不想使用多余的空格:
<stuff> | xargs -L1 -I {} echo "${url}&page=queryresults&j=" {}
类似地,如果我删除&page=queryresults
位,它就可以工作。我不知道为什么。
我在这里想念什么?
它适用于此:
blajob_123abcd_1234567890x
但不是这样:SomeTask_some_long_project_name_with_cumulative_metrics_YYYYMMDD_2018_08_15T00_12345a67b8-scheduled-run-bla-bla-bla-yadda
答案 0 :(得分:5)
这里完全不需要xargs
,没有它,您会更好。保证可以在所有POSIX兼容的外壳上正确运行以下内容:
while IFS= read -r line; do
printf '%s&page=queryresults&j=%s\n' "$url" "$line"
done
为什么不坚持使用xargs -I {} echo "$url&...&j={}"
?
xargs -I
的规范包括以下文本:构造参数不能大于255个字节。如果您的网址很长,则可能会导致截断-似乎与所述的详细信息相符。xargs -I
仅包含在POSIX的XSI扩展中;不要求实现这些扩展的平台不需要提供它,或者如果需要,也可以使其具有任何特定方式。xargs printf "$url..."
(将URL替换为格式字符串而不是通过占位符),则如果URL包含%
符号,则会出现错误。echo
,则如果您的URL包含文字反斜杠(请参阅the POSIX specification for echo
的APPLICATION USAGE部分),您将有未指定的行为。也就是说,如果您真的要使用xargs
,请考虑(在GNU系统上):
xargs -d $'\n' printf "${url//%/%%}"'&page=queryresults&j=%s\n'
...或者在具有BSD工具的平台上:
tr '\n' '\0' | xargs -0 printf "${url//%/%%}"'&page=queryresults&j=%s\n'
注意:
-I
,所以255个字符的限制根本不适用。 (类似地,xargs
可以将尽可能多的参数传递给/usr/bin/printf
的每个实例,以适合其命令行,而不是每次调用都限于一个参数)。%
文字替换为%%
。如果该URL已经正确编码,则不应包含任何反斜杠(它们应该已经被%5C
取代)。-d
来指定仅将换行符视为单词之间的定界符,将其视为自变量;这也可以防止文字引号被xargs
本身解析和使用。在BSD平台上,将换行符转换为NUL并使用-0
可以替代。