-re
플래그를 직접 사용하여 expect
에 regexp
을 직접 사용할 수 있습니다. 작은 따옴표와 큰 따옴표 문제를 지적한 Donal에게 감사드립니다. 나는 두 가지 방법으로 해결책을 제시했다. 다음과 같이 내가 내용을 가진 파일을 만든
는
Id Name
-------------------
abcd 12 John Smith
이 아무것도하지만 자바 프로그램의 콘솔 출력되지 않습니다. 나는 이것으로 나의 시스템에서 이것을 테스트했다. 즉, 방금 cat
을 사용하여 프로그램의 출력을 시뮬레이션했습니다. cat
코드를 프로그램 명령으로 바꿉니다. 단순한. :)
따옴표 :
#!/bin/bash
expect -c "
spawn ssh [email protected]
expect \"password\"
send \"mypassword\r\"
expect {\\\$} { puts matched_literal_dollar_sign}
send \"cat input_file\r\"; # Replace this code with your java program commands
expect -re {-\r\n(.*?)\s\s}
set output \$expect_out(1,string)
#puts \$expect_out(1,string)
puts \"Result : \$output\"
"
단일 따옴표 : 당신이 볼 수 있듯이
#!/bin/bash
expect -c '
spawn ssh [email protected]
expect "password"
send "mypasswordhere\r"
expect "\\\$" { puts matched_literal_dollar_sign}
send "cat input_file\r"; # Replace this code with your java program commands
expect -re {-\r\n(.*?)\s\s}
set output $expect_out(1,string)
#puts $expect_out(1,string)
puts "Result : $output"
'
, 나는 {-\r\n(.*?)\s\s}
을 사용하고 있습니다. 여기서 중괄호는 모든 변수 대체를 방지합니다. 출력물에는 두 번째 행에 하이픈이 가득 찼습니다. 그럼 줄 바꿈. 그런 다음 3 번째 줄 내용. 사용 된 정규 표현식을 디코딩합시다.
-\r\n
은 하나의 리터럴 하이픈과 새 라인을 일치시키는 것입니다. 그러면 두 번째 줄의 마지막 하이픈과 줄 바꿈이 이제는 세 번째 줄과 일치합니다. 따라서 \s\s
에 일치하는 이중 공간을 만날 때까지 .*?
은 필수 출력 (예 : abcd 12)과 일치합니다.
왜 내가 하위 일치 패턴을 얻는 데 사용되는 괄호가 필요한지 궁금 할 것입니다.
일반적으로 expect
은 예상 전체 일치 문자열을 expect_out(0,string)
에 저장하고 모든 일치/일치하지 않는 입력을 expect_out(buffer)
에 버퍼링합니다.각 하위 일치는 expect_out(1,string)
, expect_out(2,string)
등과 같이 문자열의 후속 번호 매기기에 저장됩니다. DONAL는 지적 덜 지저분한 외모 때문에
, 작은 따옴표의 접근 방식을 사용하는 것이 좋습니다. :)
큰 따옴표가있는 경우 \r
을 백 슬래시로 이스케이프하지 않아도됩니다.
업데이트 : -\r\n(.*?)\s\s
에 -\r\n(\w+\s+\w+)\s\s
에서 regexp
을 변경 한
. 귀하의 요구 사항 - - 이런 식으로
같은
match any number of letters and single spaces until you encounter first occurrence of double spaces in the output
이제
로의 귀하의 질문에 올 수 있습니다. 시도해 보았습니다. -\r\n(\w+)\s\s
. 그러나 \w+
에 문제가 있습니다. \w+
은 공백 문자와 일치하지 않음을 기억하십시오. 출력물에 공백이 두 칸있을 때까지 공백이 있습니다.
regexp의 사용은 일치시킬 입력 문자열에 대한 요구 사항에 따라 달라집니다. 필요에 따라 정규 표현식을 사용자 정의 할 수 있습니다.
업데이트 버전 2 : .*?
의 의미는 무엇
. 따로 묻는다면, 나는 당신이 논평 한 것을 반복 할 것입니다. 정규 표현식에서 *
은 욕심 많은 연산자이고 ?
은 우리의 생명을 구하는 사람입니다. 우리가 지금
Stackoverflow is already overflowing with number of users.
와 같은 문자열을 고려 정규 표현식 아래
.*flow
의 효과를 보자.
*
는 문자의 번호와 일치합니다.
좀 더 정확히 말하자면 패턴 자체가 일치하면서 가능한 한 가장 긴 문자열을 찾습니다. 따라서이 패턴의 및
flow
과 일치하는 패턴의
.*
은 문자열의
flow
과 일치하는 패턴입니다.
이제는 .*
이 문자열 flow
의 첫 번째 발생과 일치하지 않게하기 위해 을 추가합니다. ?
이 추가됩니다. 패턴이 비 탐욕적인 방식으로 행동하는 데 도움이됩니다.
지금, 다시 질문으로 돌아 오는.
.*\s\s
을 사용했다면 가능한 한 많이 일치하려고하므로 전체 줄과 일치합니다. 이것은 정규식의 일반적인 동작입니다.
업데이트 버전 3 :
는 다음과 같은 방법으로 당신의 코드가 있습니다.흐름이 제대로 일어난 경우
x=$(expect -c "
spawn ssh [email protected]
expect \"password\"
send \"password\r\"
expect {\\\$} { puts matched_literal_dollar_sign}
send \"cat input\r\"
expect -re {-\r\n(.*?)\s\s}
if {![info exists expect_out(1,string)]} {
puts \"Match did not happen :(\"
exit 1
}
set output \$expect_out(1,string)
#puts \$expect_out(1,string)
puts \"Result : \$output\"
")
y=$?
# $x now contains the output from the 'expect' command, and $y contains the
# exit status
echo $x
echo $y;
, 다음 종료 코드는 그렇지 0으로 값을가집니다, 그것은이 방법 1.이있을 것이다, 당신은 bash는 스크립트에서 반환 값을 확인할 수 있습니다.
info exists
명령에 대해 알아 보려면 here을보십시오.
핵심 문제는 expect 스크립트를 큰 따옴표로 묶은 쉘 리터럴에 넣으려고한다는 것입니다. 그것은 당신에게 백 슬래시 인용문을 사용하도록 강제 할 것입니다. 그렇게 할 수있는 동안 expect 스크립트를 자신의 파일 (예 :'mydostuff.exp')에 넣으면 모든 것이 훨씬 간단 해집니다. 'expect mydostuff.exp'로 실행할 수 있습니다 ... –