이 두 명령의 기능은 무엇입니까?

이 두 명령의 기능은 무엇입니까?

제가 잘 이해하지 못하는 스크립트가 있습니다. 이 스크립트는 구성 파일을 하드웨어에 할당합니다.

다음 두 줄을 잘 이해하지 못합니다.

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부분이 불완전해 보입니다. (두 번째 줄이 실제로 작동한다고 확신하시나요?)

관련 정보