계산 및 스크립트 제어를 위해 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이지만 산술식에서는 " x기수 로 취급하여 y십진수로 변환한다"는 뜻이다. 예를 들어, 10은 2진수에서 2를 나타내기 때문에 다음과 같이 2#10평가되고 , 10진수를 10진수로 변환하면 아무 일도 하지 않으므로 평가되고 ("4"는 3진수에서 유효한 기호가 아니기 때문에) 오류가 발생합니다. 자세한 내용은 섹션 에서 확인할 수 있습니다 .210#10103#4ARITHMETIC EVALUATIONman bash

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

마지막 줄은 단지 추가 변수 할당입니다. 여기에는 트릭이 있습니다. ${#cells[@]}배열의 항목 수만 계산합니다 cells.

그것이 바로 핵심입니다.

관련 정보