在shell脚本中逐字符解析字符串

发布于 2024-12-03 03:13:21 字数 126 浏览 0 评论 0原文

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

I am trying to parse a url to extract some text from it so that i can use the same to rename my file when i download it. Basically i want to write to a shell script to do this. I would like to collect the url into a string and then parse it character by character. How could this be done in shell script???

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

秋意浓 2024-12-10 03:13:21

您可以使用子字符串扩展语法逐个字符地读取字符串:

${parameter:offset:length}

示例:

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

并使用参数长度语法获取字符串的长度:

${#parameter}

示例:

${#str}

所以您可以使用以下方法迭代字符:

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

来自 bash 手册:

${#parameter}

参数长度。替换 parameter 值的字符长度。

   

${参数:偏移}
${参数:偏移:长度}

子字符串扩展。从 offset 指定的字符开始扩展到 parameter 的最大长度字符。

You can read a string char-by-char by using the Substring Expansion syntax:

${parameter:offset:length}

Example:

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

And get the length of the string with the Parameter length syntax:

${#parameter}

Example:

${#str}

So you can iterate over the characters by using this:

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

From the bash manual:

${#parameter}

Parameter length. The length in characters of the value of parameter is substituted.

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

Substring Expansion. Expands to up to length characters of parameter starting at the character specified by offset.

泪痕残 2024-12-10 03:13:21

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

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

工作原理:

  • "${url%%[?#]*}" 删除 ?之后的任何内容# (它删除查询和哈希)
  • $(basename "...") 返回最后一个路径组件(最后一个 / 之后的部分)

This will give you the filename to save to:

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

How it works:

  • "${url%%[?#]*}" removes any thing after ? and # (it removes the query and the hash)
  • $(basename "...") returns the last path component (the part after the last /)
↘人皮目录ツ 2024-12-10 03:13:21
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< /code> 和一些(通常是 Linux 或嵌入式系统之外的其他 Unix 风格)系统根本没有 bash。

url='http://youtube.com/watch?v=Od3xkrxcsE8&feature=relmfu'
url=${url#*v=}
url=${url%%&*}

or you can use sed, which is less efficient (starts external command), but more flexible and for more complicated cases also more readable.

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

Note, that in shell (/bin/sh), the ${var#prefix-pattern} and ${var%suffix-pattern} are the only string manipulation functions available. In bash or zsh you have many more, but always be aware that you are using such extension, because some systems have simpler shell installed as /bin/sh and some (usually other Unix flavours than Linux or embedded systems) systems don't have bash at all.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文