여기에 설명된 원래 문제에 따라:- 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 사용의 기본 아이디어를 이해하지만 그것이 어떻게 관리되는지는 이해할 수 없습니다.
- 대체하려면 패턴을 해결하세요.
- 대체할 패턴을 생성합니다.
또한 여기서 eval()과의 결합은 우리를 초월합니다. 게다가 우리가 이해하지 못하는 #의 세 가지 용도가 있습니다.
도와주세요. 감사해요.
답변1
우선, 당신이 언급하지 않았기 때문에 이것이 bash 스크립트라고 가정합니다.
이 두 줄의 높은 수준의 광택은 의 출력에서 제목 번호와 장 번호를 추출하여 lsdvd
이라는 배열에 저장한다는 것입니다 cells
.
주어진 코드는 to_cell=${cell[title_num]}
마지막 줄에 가 있어야 하기 때문에 작동하지 않을 가능성이 높습니다 to_cell=${cells[title_num]}
.
더 자세한 분석은 다음과 같습니다.
이 명령은 의 출력에서 다음 과 sed
같은 숫자를 검색합니다 . 그런 다음 해당 숫자를 및 각각에 저장합니다. 백슬래시 참조를 제목 및 장 번호로 대체하여 형식의 문자열을 출력합니다 .Title:
Chapters:
lsdvd
sed
\1
\2
sed
cells[$((10#\1))]=$((10#\2))
나는 당신이 구문 때문에 혼란스러워한다고 생각합니다 $((10#x))
. 분석은 다음과 같습니다. $((expression))
bash에서는 " expression
산술 표현식으로 처리하여 평가합니다"를 의미하고, 는 " 기본 숫자로 처리하여 십진수로 변환"을 y#x
의미하는 산술 표현식을 의미합니다. 따라서 예를 들어 10은 2진수에서 2를 나타냄 으로 평가되고 , 10진수를 10진수로 변환해도 아무 작업도 수행되지 않으므로 다음과 같이 평가되고 ("4"는 3진수에서 유효한 기호가 아니기 때문에) 오류가 발생합니다. . 자세한 내용은 섹션 에서 확인할 수 있습니다 .x
y
2#10
2
10#10
10
3#4
ARITHMETIC EVALUATION
man bash
따라서 sed
명령은 다음과 같은 문자열을 출력합니다. cells[$((10#x))]=$((10#y))
여기서 x
및 y
숫자는 숫자입니다. 그것은 으로 전달됩니다 eval
. 이 시점에서 이 문자열을 평가하면 bash에서 표준 배열 할당이 발생한다는 것을 충분히 알 수 있다고 생각합니다. 산술 표현식을 평가한 후 문자열은 다음과 같기 때문입니다 cells[x]=y
.
마지막 줄은 한 가지 트릭을 사용한 추가 변수 할당입니다. ${#cells[@]}
단지 배열의 항목 수로 평가됩니다 cells
.
그것이 바로 핵심입니다.