私がよく理解していないスクリプトがあります。このスクリプトは、構成ファイルをハードウェアに割り当てます。
次の2行をよく理解していません。
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|./||')
どちらもクエリ結果を変数に割り当てます。最初は製品名を選択して文字を置き換えます(どれですか)。 2番目のクエリは、最初のクエリの結果を使用して設定ファイルを検索します。しかし、検索文字列は正確に何であり、ここで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が行の終わりから一致しない最初の行まで、すべてのスペースとタブを一致させ、再び何もないものに置き換えます。
2番目の表現を検索みんな現在のディレクトリの「.cfg」ファイル
find . -type f -name *.cfg
そしてgrep
それらのそれぞれ
-exec grep -li "$TYPE" '{}' \;
-i
変数に格納されている文字列と大文字と小文字を区別せずに一致するものを見つけ、一致する$TYPE
ファイル名を返します。あなたの投稿にはどのような内容が含まれているのか-l
わかりません。$TYPE
sed
別の区切り文字を使用するようになりました(引数でコマンドではなく最初の文字を区切り文字にして、sed
好きなように使用できます。この場合、検索なので一般的な区切り/
文字は必要ありません。文字の1つであり、そうではありsed 's/.\///'
ません。非常に明確です)
sed 's|./||'
grep
2番目の文字が.の場合は、各ファイル名から最初の2文字が削除されます/
。最初の項目.
は「すべての文字」のワイルドカード一致であるためです。
これは./
すべてのパス名からを削除することを意味できますが(この場合はそうなります)、.
リテラルではなく「すべての文字」と解釈されます.
。確実にするただ.
テキストを変更した後、.
特殊文字をエスケープする必要があります。
sed 's|\./||'
最後に、一致をgrep
スペースで区切られたリストで囲みます。
CONFIG_FILE=$(.....)