이 "sed" 명령을 나에게 설명하고 개선하도록 도와주실 수 있나요?

이 "sed" 명령을 나에게 설명하고 개선하도록 도와주실 수 있나요?

명령줄을 찾았지만 정확히 무슨 일이 일어나고 있는지 이해하지 못합니다.

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쉘 스크립팅의 기본 원칙입니다.

  1. pdftk $1 dump_data두 개의 인수를 사용하여 pdftk바이너리(인기 PDF 조작 프로그램)를 호출합니다. 첫 번째 인수는 쉘 스크립트에 대한 첫 번째 인수로 입력하는 것입니다. 두 번째 매개변수 pdftk는 command 입니다 dump_data.

  2. 첫 번째 명령의 출력은 |대체인 파이프(기호)를 통해 두 번째 명령에 직접 연결됩니다 sed.

  3. InfoValue:공백 문자와 기타 문자가 뒤따르는 문자열 발생 \s- 점은 모든 문자를 나타내고 별표는 반복 횟수, 일치 횟수를 나타냅니다. 그러나 대체에는 첫 번째 부분(백슬래시 괄호 쌍)만 있고 그 뒤에 흰색 부분이 있습니다. 마지막 백슬래시 뒤에 무엇이 와야 하는지는 실제로 명확하지 않습니다. Final은 g"모든 항목을 교체"를 의미합니다.

답변2

... | sed -e 's/\(InfoValue:\)\s.*/\1\ /g'

s/pattern/replacement/g명령은 일치하는 모든 항목을 찾습니다.무늬온라인으로 가서 다음으로 교체하세요.대안. 왼쪽 부분은 \(InfoValue:\)\s.*리터럴 문자열 InfoValue:(괄호로 인해 캡처), 공백( \s아마도 Perl의 GNUism에서 나온 것임), 그리고 .*줄 끝까지의 모든 항목( )과 일치한다는 것입니다. 교체의 참조는 \1캡처된 첫 번째 그룹(여기서는 유일한 그룹)이고 공백은 문자 그대로의 공백입니다. 캡처 그룹은 리터럴 문자열과 일치하므로 실제로 캡처할 필요가 없으며 동일한 문자열이 오른쪽에서 반복될 수 있습니다. 그러나 그렇게 하면 불필요한 중복이 확실히 제거됩니다.

따라서 포함된 줄에서 InfoValue:그 뒤의 모든 항목을 삭제합니다.

sedsed파이프가 수행하는 작업 이기 때문에 이것은 파이프에서 읽은 입력입니다 . sed표준 입력에서 읽는 경우(파일 이름이 지정되지 않은 경우) 파이프는 왼쪽 명령의 표준 출력을 오른쪽 명령의 표준 입력에 연결합니다. 명령.

$1오른쪽에 있는 것은 그것과 전혀 관련이 없습니다 sed. 스크립트의 첫 번째 명령줄 인수를 참조하는 셸 인수입니다. (또는 거기에서 사용되는 경우 쉘 기능). 스크립트의 일부인 경우 다음 whatever.sh somefile.pdf과 같이 실행되어야 합니다.pdftkdump_data운영 주어진 파일에.

관련 정보