我有一个我不太明白的脚本。该脚本将配置文件分配给硬件。
我不太明白以下两行:
export TYPE=$(dmidecode -s system-product-name | sed 's/^[ \t]*//;s/[ \t]*$//')
CONFIG_FILE=$(find . -type f -name *.cfg -exec grep -l -i "$TYPE" '{}' \; | sed 's|./||')
两者都将查询结果分配给变量。第一个选择产品名称并替换字符(哪个?)。第二个查询使用第一个查询的结果查找配置文件。但搜索字符串到底是什么以及这里使用 sed 替换的内容。
更多信息:已经有一些配置文件。如果 dmidecode 命令找到“HP EliteBook 850 G5”,下一步将使用“WIN10_HP_ELITE_8x_G5.cfg”文件。现在我必须为“HP ProBook x360 440 G1”创建一个文件,并想简单说明一下它是如何工作的。
答案1
sed 's/^[ \t]*//'
锚点^
告诉sed
从行的开头开始,正则表达式组[ \t]*
匹配从行的开头到第一个不匹配的所有*
空格[ ]
或制表符,并将它们替换为任何内容(即删除它们)。[\t]
//
在方括号内,[]
您可以指定要匹配的字符范围。
sed 's/[ \t]*$//'
锚$
标记了行尾,因此这次 sed 将从行尾到第一个不匹配的所有空格和制表符匹配,并再次将它们替换为空。
您的第二个表达式搜索全部当前目录下的“.cfg”文件
find . -type f -name *.cfg
和grep
他们各自
-exec grep -li "$TYPE" '{}' \;
查找变量-i
中存储的任何字符串的不区分大小写的匹配,并返回任何匹配的$TYPE
文件名。-l
从您的帖子中无法看出$TYPE
包含哪些内容
最终sed
使用不同的分隔符(sed
将参数中的第一个非命令字符作为分隔符,因此您可以使用适合您的任何内容,在这种情况下您不需要通常的分隔符,/
因为它是您的搜索字符之一并且sed 's/.\///'
是不太清楚)
sed 's|./||'
grep
每当第二个字符是 . 时,将从每个文件名中删除前两个字符/
。这是因为第一个.
是“任何字符”的通配符匹配。
这可能意味着./
从所有路径名中删除 the (在本例中将会删除),但 the.
被解释为“任何字符”而不是文字.
。确保仅有的.
替换文字后,.
应转义特殊字符
sed 's|\./||'
最后将匹配项grep
作为空格分隔的列表捆绑到
CONFIG_FILE=$(.....)
答案2
sed 's/^[\t]*//; s/[\t]*$//'
这会将换行符之前和之后的所有选项卡替换为空。
在撰写本文时,第二个sed
操作存在语法错误,根本无法工作。
答案3
- https://linux.die.net/man/8/dmidecode
- 关于
sed
第一行的部分:有很多额外的空格(在此处发布代码时添加?)。无论如何,这部分的作用是删除在 .TAB
输出的行的开头或结尾找到的字符dmidecode
。结果以TYPE
变量结尾 第二行(又是额外的空格)非常神秘,因为我们没有足够的信息:
- 没有关于
$HW_TYPE
变量的信息 - 该
sed
部分对我来说看起来不完整(您确定第二行确实有效吗?)
- 没有关于