【问题标题】:Need help reading a grep/sed/regex statement需要帮助阅读 grep/sed/regex 语句
【发布时间】:2018-02-23 21:38:09
【问题描述】:

有人可以接受以下陈述吗:

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/,//')

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

【问题讨论】:

  • 匹配"uImage-,后跟0123456789.集合中存在的任意数量的字符,后跟-ts-armv7l": ,后跟^, }集合中存在的任意数量的字符 AND 匹配"uImage-,后跟0123456789. 集合中存在的任意数量的字符,然后是-ts-armv7l,后跟任意数量的非换行符(但在下一个标记之前尽可能少)匹配),然后是单词边界((^\w|\w$|\W\w|\w\W) 不消耗字符),然后是 type,然后是另一个单词边界,最后是 "

标签: regex bash sed scripting grep


【解决方案1】:

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

Grep

man grep 帮助我们将参数解析为 grep:

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

Grep 正则表达式

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

匹配"key": value

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

'"uImage-[0123456789.]*-ts-armv7l.*?\btype\b"'

匹配一个“引用”的字符串

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

剪切

cut -f3 -d ' '

来自man cut

  • -f3:返回第三个字段
  • -d ' ':按空格分割

所以这个 cut 命令将字符串拆分为空格并返回第 3 部分。

sed 命令

sed 's/^.*: //'

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

sed 's/,//'

将在字符串中找到的第一个, 替换为空。

注意

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

【讨论】:

  • .*: 是贪婪的,所以它会替换所有内容,直到行中的最后一个 : 。在这里并不重要,但它确实使行首的^ 锚点变得不必要。像^[^:]*: 这样的东西会更有意义。
  • 解释得很透彻!并且很有帮助。谢谢威尔。
猜你喜欢
  • 1970-01-01
  • 2011-06-15
  • 2017-10-02
  • 1970-01-01
  • 1970-01-01
  • 2014-10-31
  • 1970-01-01
  • 1970-01-01
  • 2021-05-31
相关资源
最近更新 更多