제가 잘 이해하지 못하는 스크립트가 있습니다. 이 스크립트는 구성 파일을 하드웨어에 할당합니다.
다음 두 줄을 잘 이해하지 못합니다.
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
두 번째 문자가 .일 때마다 각 파일 이름에서 처음 두 문자가 제거됩니다 /
. 첫 번째 항목 .
은 "모든 문자"의 와일드카드 일치이기 때문입니다 .
이는 ./
모든 경로 이름에서 를 제거하는 것을 의미할 수 있지만(이 경우에는 그렇게 됩니다) 은 .
리터럴이 아닌 "모든 문자"로 해석됩니다 .
. 확실하게 하다오직.
텍스트를 바꾼 후 .
특수 문자를 이스케이프해야 합니다.
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
부분이 불완전해 보입니다. (두 번째 줄이 실제로 작동한다고 확신하시나요?)