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

时间:2011-09-05 09:41:48

标签: shell string-parsing

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

3 个答案:

答案 0 :(得分:0)

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

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

工作原理:

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

答案 1 :(得分:0)

您可以使用Substring Expansion语法读取字符串char-by-char:

${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 lengthparameter的值的字符长度被替换。

  

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

     

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

答案 2 :(得分: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和一些(通常其他Unix风格,而不是Linux或嵌入式系统)系统根本没有bash。