bash - 使用 xargs 在 bash 中连接 URL

标签 bash xargs

我正在尝试从每行一个条目的输出构建 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

最佳答案

这里根本不需要xargs,没有它你会过得更好。以下保证在所有符合 POSIX 标准的 shell 上正常工作:

while IFS= read -r line; do
  printf '%s&page=queryresults&j=%s\n' "$url" "$line"
done

为什么不坚持使用 xargs -I {} echo "$url&...&j={}"

  • xargs -I 的规范包括以下文本:构造的参数不能大于 255 字节。如果您的 URL 很长,这可能会导致截断——这似乎与所描述的详细信息相符。
  • xargs -I 仅包含在 POSIX 的 XSI 扩展中;未声称实现这些扩展的平台不需要提供它,或者如果它们提供了,也不需要让它以任何特定方式运行。
  • 如果您使用 xargs printf "$url..."(将 URL 替换为格式字符串而不是通过占位符),如果您的 URL 包含 % 标志。
  • 如果您使用 echo,如果您的 URL 包含文字反斜杠(请参阅 the POSIX specification for echo 的应用程序使用部分),您将有未指定的行为。

也就是说,如果您真的想使用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 中,我们将所有 % 文字替换为 %%。如果 URL 已经正确编码,则不应包含任何反斜杠(它们应该已被替换为 %5C)。
  • GNU 扩展 -d 被用来指定只有换行符应该被视为单词之间的分隔符,被视为参数;这也可以防止文字引号被 xargs 本身解析和使用。在 BSD 平台上,将换行符转换为 NUL 并使用 -0 作为替代。

关于bash - 使用 xargs 在 bash 中连接 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51897754/

相关文章:

bash - grep 所有 odt 文件并将它们通过管道传输到 odt2txt

bash - hive -如何将查询结果存储在Bash脚本中的变量中

linux - 从 .txt 列表中移动具有部分名称的文件

将 Apple 标签(Mavericks 标签)导出到 IPTC "Keywords"元数据的 Bash 脚本(使用 'Tag' 和 'ExifTool')

python - 从 PST -8 0 到其字母名称的时区转换

linux - 管道参数 : echo "value1 value2" | command $1 $2

command-line - 可以更改 xargs 的默认分隔符吗?

shell - 锁定多次并行调用的shell脚本的输出文件

linux - 想要从具有页眉页脚的文件中获取分隔数据,以便进行数据处理以进行性能分析

bash - 如何使用xargs输出到不同的文件名?