我正在尝试解析一个 url 以从中提取一些文本,以便在下载文件时可以使用它来重命名我的文件。基本上我想写一个shell脚本来做到这一点。我想将 url 收集到一个字符串中,然后逐个字符地解析它。这怎么能在shell脚本中完成???
问问题
8388 次
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}
是唯一可用的字符串操作函数。在bash或zsh中你有更多,但始终注意你正在使用这样的扩展,因为一些系统安装了更简单的 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 回答