如何在 Bash 中抽取子字符串

Posted Linux中国

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在 Bash 中抽取子字符串相关的知识,希望对你有一定的参考价值。

所谓“子字符串”就是出现在其它字符串内的字符串。 比如 “3382” 就是 “this is a 3382 test” 的子字符串。 我们有多种方法可以从中把数字或指定部分字符串抽取出来。
-- Vivek Gite


本文导航
编译自 | https://www.cyberciti.biz/faq/how-to-extract-substring-in-bash/ 
 作者 | Vivek Gite
 译者 | lujun9972

所谓“子字符串”就是出现在其它字符串内的字符串。 比如 “3382” 就是 “this is a 3382 test” 的子字符串。 我们有多种方法可以从中把数字或指定部分字符串抽取出来。

如何在 Bash 中抽取子字符串

How to Extract substring in Bash Shell on Linux or Unix

本文会向你展示在 bash shell 中如何获取或者说查找出子字符串。

在 Bash 中抽取子字符串

其语法为:

  
    
    
  
  1. ## 格式 ##

  2. ${parameter:offset:length}

子字符串扩展是 bash 的一项功能。它会扩展成 parameter 值中以 offset 为开始,长为 length 个字符的字符串。 假设, $u 定义如下:

  
    
    
  
  1. ## 定义变量 u ##

  2. u="this is a test"

那么下面参数的子字符串扩展会抽取出子字符串:

  
    
    
  
  1. var="${u:10:4}"

  2. echo "${var}"

结果为:

  
    
    
  
  1. test

其中这些参数分别表示:

◈ 10 : 偏移位置
◈ 4 : 长度

使用 IFS

根据 bash 的 man 页说明:

IFS (内部字段分隔符)[1]用于在扩展后进行单词分割,并用内建的 read 命令将行分割为词。默认值是。

另一种 POSIX 就绪POSIX ready的方案如下:

  
    
    
  
  1. u="this is a test"

  2. set -- $u

  3. echo "$1"

  4. echo "$2"

  5. echo "$3"

  6. echo "$4"

输出为:

  
    
    
  
  1. this

  2. is

  3. a

  4. test

下面是一段 bash 代码,用来从 Cloudflare cache 中去除带主页的 url。

  
    
    
  
  1. #!/bin/bash

  2. ####################################################

  3. ## Author - Vivek Gite {https://www.cyberciti.biz/}

  4. ## Purpose - Purge CF cache

  5. ## License - Under GPL ver 3.x+

  6. ####################################################

  7. ## set me first ##

  8. zone_id="YOUR_ZONE_ID_HERE"

  9. api_key="YOUR_API_KEY_HERE"

  10. email_id="YOUR_EMAIL_ID_HERE"

  11. ## hold data ##

  12. home_url=""

  13. amp_url=""

  14. urls="$@"

  15. ## Show usage

  16. [ "$urls" == "" ] && { echo "Usage: $0 url1 url2 url3"; exit 1; }

  17. ## Get home page url as we have various sub dirs on domain

  18. ## /tips/

  19. ## /faq/

  20. get_home_url(){

  21.    local u="$1"

  22.    IFS='/'

  23.    set -- $u

  24.    echo "${1}${IFS}${IFS}${3}${IFS}${4}${IFS}"

  25. }

  26. echo

  27. echo "Purging cache from Cloudflare。.。"

  28. echo

  29. for u in $urls

  30. do

  31.     home_url="$(get_home_url $u)"

  32.     amp_url="${u}amp/"

  33.     curl -X DELETE "https://api.cloudflare.com/client/v4/zones/${zone_id}/purge_cache" \

  34.          -H "X-Auth-Key: ${api_key}" \

  35.          -H "Content-Type: application/json" \

  36.          --data "{\"files\":[\"${u}\",\"${amp_url}\",\"${home_url}\"]}"

  37.     echo

  38. done

  39. echo

它的使用方法为:

  
    
    
  
  1. ~/bin/cf.clear.cache https://www.cyberciti.biz/faq/bash-for-loop/ https://www.cyberciti.biz/tips/linux-security.html

借助 cut 命令

可以使用 cut 命令来将文件中每一行或者变量中的一部分删掉。它的语法为:

  
    
    
  
  1. u="this is a test"

  2. echo "$u" | cut -d' ' -f 4

  3. echo "$u" | cut --delimiter=' ' --fields=4

  4. ##########################################

  5. ## WHERE

  6. ##   -d' ' : Use a whitespace as delimiter

  7. ##   -f 4  : Select only 4th field

  8. ##########################################

  9. var="$(cut -d' ' -f 4 <<< $u)"

  10. echo "${var}"

想了解更多请阅读 bash 的 man 页:

  
    
    
  
  1. man bash

  2. man cut

另请参见: Bash String Comparison: Find Out IF a Variable Contains a Substring[2]


via: https://www.cyberciti.biz/faq/how-to-extract-substring-in-bash/

本文由 LCTT 原创编译,Linux中国 荣誉推出

LCTT 译者
如何在 Bash 中抽取子字符串
lujun9972

以上是关于如何在 Bash 中抽取子字符串的主要内容,如果未能解决你的问题,请参考以下文章

按子字符串拆分字符串并将其放入数组bash

如何检查字符串是不是包含子字符串并且在 Bash 中不包含 [重复]

使用 asyncio 将 bash 作为 Python 的子进程运行,但 bash 提示被延迟

如何检查字符串是否包含子字符串,而不是在Bash中

切换片段时如何维护子视图的状态?

如何在bash中将JSON子元素字符串转换为真正的JSON元素