1

我正在尝试解析一个 url 以从中提取一些文本,以便在下载文件时可以使用它来重命名我的文件。基本上我想写一个shell脚本来做到这一点。我想将 url 收集到一个字符串中,然后逐个字符地解析它。这怎么能在shell脚本中完成???

4

3 回答 3

1

Substring Expansion您可以使用以下语法逐个字符地读取字符串:

${parameter:offset:length}

例子:

str="abcd"
char=${str:1:1} # => "b"

Parameter length并使用以下语法获取字符串的长度:

${#parameter}

例子:

${#str}

因此,您可以使用以下方法迭代字符:

for (( i = 0; i < ${#str}; ++i)); do
    echo "${str:$i:1}"
done

从 bash 手册:

${#parameter}

Parameter length. 的值的字符长度 parameter 被替换。

   

${parameter:offset}
${parameter:offset:length}

Substring Expansion. 扩展为parameter 从 指定的字符开始的最大长度字符offset

于 2011-09-05T10:01:01.643 回答
0
url='http://youtube.com/watch?v=Od3xkrxcsE8&feature=relmfu'
url=${url#*v=}
url=${url%%&*}

或者您可以使用效率较低的 sed(启动外部命令),但更灵活,对于更复杂的情况也更具可读性。

url='http://youtube.com/watch?v=Od3xkrxcsE8&feature=relmfu'
url=$(printf '%s' "$url" | sed 's+.*v=\([^&]*\).*+\1+')

请注意,在shell ( /bin/sh) 中,${var#prefix-pattern}${var%suffix-pattern}唯一可用的字符串操作函数。在bashzsh中你有更多,但始终注意你正在使用这样的扩展,因为一些系统安装了更简单的 shell,/bin/sh而一些(通常是 Linux 或嵌入式系统之外的其他 Unix 风格)系统根本没有 bash。

于 2011-09-05T11:04:01.533 回答
0

这将为您提供要保存到的文件名:

url="http://www.example.com/path?foo#bar"
echo $(basename "${url%%[?#]*}")
# => "path"

这个怎么运作:

  • "${url%%[?#]*}"?在and之后删除任何东西#(它删除查询和哈希)
  • $(basename "...")返回最后一个路径组件(最后一个 / 之后的部分)
于 2011-09-05T09:53:30.430 回答