eval 및 sed를 사용하여 계산 및 스크립트 제어 수행

eval 및 sed를 사용하여 계산 및 스크립트 제어 수행

여기에 설명된 원래 문제에 따라:- DVD의 챕터를 리핑하여 파일 분리

..다음 코드가 수행하는 작업을 이해하는 데 누군가 도움을 줄 수 있나요?

# count Titles, and count Cells per title. 
# eg. ${cell[1]}      is the Count of Cells for the first title
#     ${cell[titles]} is the Count of Cells for the last title 
eval $(lsdvd | sed -n 's/Title: \([0-9]\+\), .* Chapters: \([0-9]\+\), Cells: .*/cells[$((10#\1))]=$((10#\2));/p')
titles=${#cells[@]} title_num=2 from_cell=1 to_cell=${cell[title_num]}

우리도 같은 일을 하고 싶고 코드를 사용해 보았습니다. 불행하게도 우리에게는 작동하지 않으며 우리의 이해가 제한되어 있기 때문에 디버깅할 수 없습니다.

우리는 sed 사용의 기본 아이디어를 이해하지만 그것이 어떻게 관리되는지는 이해할 수 없습니다.

  1. 대체하려면 패턴을 해결하세요.
  2. 대체할 패턴을 생성합니다.

또한 여기서 eval()과의 결합은 우리를 초월합니다. 게다가 우리가 이해하지 못하는 #의 세 가지 용도가 있습니다.

도와주세요. 감사해요.

답변1

우선, 당신이 언급하지 않았기 때문에 이것이 bash 스크립트라고 가정합니다.

이 두 줄의 높은 수준의 광택은 의 출력에서 ​​제목 번호와 장 번호를 추출하여 lsdvd이라는 배열에 저장한다는 것입니다 cells.

주어진 코드는 to_cell=${cell[title_num]}마지막 줄에 가 있어야 하기 때문에 작동하지 않을 가능성이 높습니다 to_cell=${cells[title_num]}.

더 자세한 분석은 다음과 같습니다.

이 명령은 의 출력에서 ​​다음 과 sed같은 숫자를 검색합니다 . 그런 다음 해당 숫자를 및 각각에 저장합니다. 백슬래시 참조를 제목 및 장 번호로 대체하여 형식의 문자열을 출력합니다 .Title:Chapters:lsdvdsed\1\2sedcells[$((10#\1))]=$((10#\2))

나는 당신이 구문 때문에 혼란스러워한다고 생각합니다 $((10#x)). 분석은 다음과 같습니다. $((expression))bash에서는 " expression산술 표현식으로 처리하여 평가합니다"를 의미하고, 는 " 기본 숫자로 처리하여 십진수로 변환"을 y#x의미하는 산술 표현식을 의미합니다. 따라서 예를 들어 10은 2진수에서 2를 나타냄 으로 평가되고 , 10진수를 10진수로 변환해도 아무 작업도 수행되지 않으므로 다음과 같이 평가되고 ("4"는 3진수에서 유효한 기호가 아니기 때문에) 오류가 발생합니다. . 자세한 내용은 섹션 에서 확인할 수 있습니다 .xy2#10210#10103#4ARITHMETIC EVALUATIONman bash

따라서 sed명령은 다음과 같은 문자열을 출력합니다. cells[$((10#x))]=$((10#y))여기서 xy숫자는 숫자입니다. 그것은 으로 전달됩니다 eval. 이 시점에서 이 문자열을 평가하면 bash에서 표준 배열 할당이 발생한다는 것을 충분히 알 수 있다고 생각합니다. 산술 표현식을 평가한 후 문자열은 다음과 같기 때문입니다 cells[x]=y.

마지막 줄은 한 가지 트릭을 사용한 추가 변수 할당입니다. ${#cells[@]}단지 배열의 항목 수로 평가됩니다 cells.

그것이 바로 핵심입니다.

관련 정보