2016-06-14 1 views
1

말의 somefile 콘텐츠큰 파일과 출력 라인을 반복하여 stdin을 통해 컬링하는 방법은 무엇입니까?

a 
b 
c 

내가 각 라인은 3 HTTP POST 컬 명령으로 전환되고 싶지가 포함되어 있습니다. 그래서 3 번 줄은 "url"에 "c"를 올릴 것입니다.

내가 bash에있는 파일을 반복하고 덤프 그러나이

cat somefile | while read line; \ 
    do curl -XPOST 'www.example.com' -d "$line"; \ 
done 

처럼 곱슬 곱슬 할 수는 줄은 거대한 JSON 파일입니다 때로는 명령 줄를 통과하는 것은 이상한 일을한다. 차라리 이와 같은 것을 가지고 싶습니다.

cat somefile | parallel curl -XPOST example.com -d @- 

여기서 '@ -'는 파일의 각 줄이 stdin을 통해 말려 들어가는 것을 의미합니다. gnu parallel은 {$ line}과 비슷한 인자로 {}를 받아 들일 수 있습니다. 그러나 다음 명령으로 전달하기 전에 파일을 줄의 흐름으로 바꾸는 것이 좋습니다.

답변

1
cat somefile | parallel --pipe -N1 curl -XPOST example.com -d @- 
1

ShellCheck는 말한다 :

$ echo '{ "key": "some value with \"nested quotes\" here" }' | \ 
     while read -r line; do echo "$line"; done 
{ "key": "some value with \"nested quotes\" here" } 
다음 -r 대신 혼자 그들을 떠나 추가

$ echo '{ "key": "some value with \"nested quotes\" here" }' | \ 
     while read line; do echo "$line"; done 
{ "key": "some value with "nested quotes" here" } 

:

Line 1: 
cat somefile | while read line; \ 
        ^-- SC2162: read without -r will mangle backslashes. 

이가 자주 백 슬래시를 사용하여 JSON에 이상한 일을 설명 할 것

완전히 정확하려면이어야합니다.은 선행 공백도 보존합니다. 관련 POSIX docs for read


: -r 옵션을 지정하지 않으면 기본적으로

는 < 백 슬래시> 이스케이프 문자로 활동한다. 이스케이프 처리되지 않은 < 백 슬래시>는 < 개행을 제외하고 다음 문자의 리터럴 값을 보존합니다. < 개행>이 < 백 슬래시> 다음에 오는 경우 읽기 유틸리티는 이것을 줄 연속으로 해석해야합니다. < 백 슬래시> 및 < 개행>은 입력을 필드로 분할하기 전에 제거되어야합니다. 다른 모든 이스케이프 처리되지 않은 < 백 슬래시> 문자는 입력을 필드로 분할 한 후에 제거됩니다.

1
cat somefile | parallel 'echo {} | curl -XPOST example.com -d @-' 
관련 문제