这两个命令的作用是什么

这两个命令的作用是什么

我有一个我不太明白的脚本。该脚本将配置文件分配给硬件。

我不太明白以下两行:

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部分对我来说看起来不完整(您确定第二行确实有效吗?)

相关内容