주어진 행 번호의 패턴을 기반으로 데이터를 추출합니다.

주어진 행 번호의 패턴을 기반으로 데이터를 추출합니다.

다음과 같은 행(6번째 줄)을 찾으려고 합니다.

"password": "......."

line으로 시작하는 모든 파일에서"whatever here": "...."

그런 다음 기호 뒤에 쓰여진 내용을 추출하고 추가 단어와 문자를 모두 제거하고 싶습니다 :. "password": "" 그리고 따옴표 사이에 ........ 부분을 가져옵니다.

나중에 이 변수를 동일한 스크립트의 새 명령으로 대체하여 URL을 가져오고 싶기 때문에 이를 새 변수(여기서는 user1로 명명했습니다)로 정의하고 싶습니다.

이 명령을 사용했지만 작동하지 않습니다.

 user1=`head -6| grep -v "\<"password:"\>" myfile.txt`

 wget '....$user1&......

누구든지 나를 도와줄 수 있나요? 나는 이것을 며칠 동안 조사해 왔지만 이것을 알 수 없습니다.

답변1

노력하다:

user1=$(
  sed -n '
    6!d; # disregard any line but the 6th one
    s/^[[:blank:]]*"password"[[:blank:]]*:[[:blank:]]*"\(.*\)".*/\1/p
    q' myfile.txt
)

CGI GET 매개변수로 전달 하려면 해당 매개변수를 인코딩 $user1해야 합니다 .%XX

를 사용하면 ksh93다음을 수행할 수 있습니다.

wget "http://host.example/cgi-bin/script?user1=$(printf '%#H' "$user1")"

perl다른 쉘의 경우 URI 이스케이프를 사용할 수 있습니다 .

uri_escape() {
  perl -MURI::Escape -le 'print map {uri_escape $_} @ARGV' -- "$@"
}

wget "http://host.example/cgi-bin/script?user1=$(uri_escape "$user1")"

또는 curl대신 which를 사용하여 wget매개변수를 직접 인코딩합니다.

curl -G -O --data-urlencode "user1=$user1" 'http://host.example/cgi-bin/script'

답변2

데이터 파일('afile')의 내용이 다음과 같다고 가정합니다.

$ cat afile
now
is
the
time
for
"password": "all good men"
to
come
to
the
aid
of
their
country

그런 다음 Bash의 다음 줄은 해당 줄을 찾아 "password":따옴표 사이에 있는 내용을 추출합니다.

$ user1=$(cat afile | grep '^[[:blank:]]*"password"[[:blank:]]*:' | sed 's/^[[:blank:]]*"password":[[:blank:]]*//' | sed 's/"//g')

$ echo $user1
all good men

문제의 줄이 정확히 6번 줄에 있다고 확신하는 경우 다음도 작동합니다.

$ user1=$(cat afile | sed '6!d' | sed 's/^[[:blank:]]*"password":[[:blank:]]*//' | sed 's/"//g')

$ echo $user1
all good men

관련 정보