需要帮助阅读grep / sed / regex语句

时间:2017-09-14 19:34:14

标签: regex bash sed scripting grep

有人可以采取以下声明:

kernelHash=$(grep -m 1 -o '"uImage-[0123456789.]*-ts-armv7l": [^, }]*' $SecureBootJson | sed 's/^.*: //')

kernelHash=$(grep -oP '"uImage-[0123456789.]*-ts-armv7l.*?\btype\b"' $SecureBootJson | cut -f3 -d ' ' | sed 's/,//')

并为我分解并解释他们应该完成什么?

1 个答案:

答案 0 :(得分:3)

两者都根据名称/路径存储在变量kernelHash中的文件的值设置变量$SecureBootJson。我会假设您了解管道|正在做什么。

grep的

man grep帮助我们解析grep:

的参数
  • -m 1:在1个匹配的行
  • 后停止读取文件
  • -o:仅打印匹配行的匹配(非空)部分
  • -P:将正则表达式解释为Perl正则表达式

Grep regexes

'"uImage-[0123456789.]*-ts-armv7l": [^, }]*'

匹配"key": value

  1. "uImage-:字面意思
  2. [0123456789.]*:零个或多个数字或点
  3. -ts-armv7l"::字面意思
  4. [^, }]*:零个或多个字符不是,}
  5. '"uImage-[0123456789.]*-ts-armv7l.*?\btype\b"'
    

    匹配“引用”字符串

    1. "uImage-:字面意思
    2. [0123456789.]*:零个或多个数字或点
    3. -ts-armv7l:字面意思
    4. .*?lazily匹配零个或多个非换行符
    5. \btype\b":使用word boundaries
    6. 匹配“类型”一词

      cut -f3 -d ' '
      

      来自man cut

      • -f3:返回第3个字段
      • -d ' ':拆分单个空格

      因此,此cut命令将字符串拆分为空格并返回第3个部分。

      sed命令

      sed 's/^.*: //'
      

      将最右边的':'行的开头之间的所有非换行符替换为空。假设grep给我们留下"key": value行,其中value不包含':'(它不能归功于grep),我们留下value

      sed 's/,//'
      

      替换字符串中找到的第一个,

      注意

      这些命令有很多怪癖和改进的机会,但我没有将它们包括在答案的主体中,因为问题是“这是做什么的?”。我最重要的建议是使用jq来解析Json。