有人可以采取以下声明:
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/,//')
并为我分解并解释他们应该完成什么?
答案 0 :(得分:3)
两者都根据名称/路径存储在变量kernelHash
中的文件的值设置变量$SecureBootJson
。我会假设您了解管道|
正在做什么。
man grep
帮助我们解析grep:
-m 1
:在1个匹配的行-o
:仅打印匹配行的匹配(非空)部分-P
:将正则表达式解释为Perl正则表达式'"uImage-[0123456789.]*-ts-armv7l": [^, }]*'
匹配"key": value
对
"uImage-
:字面意思[0123456789.]*
:零个或多个数字或点-ts-armv7l":
:字面意思[^, }]*
:零个或多个字符不是,
,
或}
和
'"uImage-[0123456789.]*-ts-armv7l.*?\btype\b"'
匹配“引用”字符串
"uImage-
:字面意思[0123456789.]*
:零个或多个数字或点-ts-armv7l
:字面意思.*?
:lazily匹配零个或多个非换行符\btype\b"
:使用word boundaries cut -f3 -d ' '
来自man cut
:
-f3
:返回第3个字段-d ' '
:拆分单个空格因此,此cut命令将字符串拆分为空格并返回第3个部分。
sed 's/^.*: //'
将最右边的':'行的开头之间的所有非换行符替换为空。假设grep
给我们留下"key": value
行,其中value
不包含':'(它不能归功于grep),我们留下value
。
sed 's/,//'
替换字符串中找到的第一个,
。
这些命令有很多怪癖和改进的机会,但我没有将它们包括在答案的主体中,因为问题是“这是做什么的?”。我最重要的建议是使用jq
来解析Json。