명령줄을 찾았지만 정확히 무슨 일이 일어나고 있는지 이해하지 못합니다.
pdftk $1 dump_data | sed -e 's/\(InfoValue:\)\s.*/\1\ /g'
이 줄에서 명령은 sed
나의 주요 의심입니다. 무슨 일이에요?
저는 이 부분이 처음이고 이 부분에서는 */\1\
명령이 sed
호출되고 있다고 생각하므로 $1
변경하면 명령을 $1
변경해야 합니다 . sed
어쩌면 다음과 같은 것일 수도 있습니다.
pdftk out dump_data | sed -e 's/\(InfoValue:\)\s.*/\out\ /g'
하지만 이론을 이해하지 못하기 때문에 sed
가설을 확신할 수 없습니다.
답변1
아니요, 이 sed
명령은 파이프 이전 명령과 직접적인 관련이 없습니다. 이 sed
명령은 표준 입력의 데이터만 허용합니다. 이것은 이론적인 질문이 아니라 sed
쉘 스크립팅의 기본 원칙입니다.
pdftk $1 dump_data
두 개의 인수를 사용하여pdftk
바이너리(인기 PDF 조작 프로그램)를 호출합니다. 첫 번째 인수는 쉘 스크립트에 대한 첫 번째 인수로 입력하는 것입니다. 두 번째 매개변수pdftk
는 command 입니다dump_data
.첫 번째 명령의 출력은
|
대체인 파이프(기호)를 통해 두 번째 명령에 직접 연결됩니다sed
.InfoValue:
공백 문자와 기타 문자가 뒤따르는 문자열 발생\s
- 점은 모든 문자를 나타내고 별표는 반복 횟수, 일치 횟수를 나타냅니다. 그러나 대체에는 첫 번째 부분(백슬래시 괄호 쌍)만 있고 그 뒤에 흰색 부분이 있습니다. 마지막 백슬래시 뒤에 무엇이 와야 하는지는 실제로 명확하지 않습니다. Final은g
"모든 항목을 교체"를 의미합니다.
답변2
... | sed -e 's/\(InfoValue:\)\s.*/\1\ /g'
이 s/pattern/replacement/g
명령은 일치하는 모든 항목을 찾습니다.무늬온라인으로 가서 다음으로 교체하세요.대안. 왼쪽 부분은 \(InfoValue:\)\s.*
리터럴 문자열 InfoValue:
(괄호로 인해 캡처), 공백( \s
아마도 Perl의 GNUism에서 나온 것임), 그리고 .*
줄 끝까지의 모든 항목( )과 일치한다는 것입니다. 교체의 참조는 \1
캡처된 첫 번째 그룹(여기서는 유일한 그룹)이고 공백은 문자 그대로의 공백입니다. 캡처 그룹은 리터럴 문자열과 일치하므로 실제로 캡처할 필요가 없으며 동일한 문자열이 오른쪽에서 반복될 수 있습니다. 그러나 그렇게 하면 불필요한 중복이 확실히 제거됩니다.
따라서 포함된 줄에서 InfoValue:
그 뒤의 모든 항목을 삭제합니다.
sed
sed
파이프가 수행하는 작업 이기 때문에 이것은 파이프에서 읽은 입력입니다 . sed
표준 입력에서 읽는 경우(파일 이름이 지정되지 않은 경우) 파이프는 왼쪽 명령의 표준 출력을 오른쪽 명령의 표준 입력에 연결합니다. 명령.
$1
오른쪽에 있는 것은 그것과 전혀 관련이 없습니다 sed
. 스크립트의 첫 번째 명령줄 인수를 참조하는 셸 인수입니다. (또는 거기에서 사용되는 경우 쉘 기능). 스크립트의 일부인 경우 다음 whatever.sh somefile.pdf
과 같이 실행되어야 합니다.pdftk
dump_data
운영
주어진 파일에.