텍스트 파일의 각 줄을 명령 인수로 구문 분석하는 방법은 무엇입니까?

텍스트 파일의 각 줄을 명령 인수로 구문 분석하는 방법은 무엇입니까?

.txt저는 파일 이름을 인수로 사용하여 파일을 한 줄씩 읽고 각 줄을 명령에 전달하는 스크립트를 작성하고 있습니다 . 예를 들어 , command --option "LINE 1"then command --option "LINE 2"등을 실행합니다 . 명령의 출력은 다른 파일에 기록됩니다. 어떻게 해야 하나요? 어디서부터 시작해야할지 모르겠습니다.

답변1

또 다른 옵션은 입니다 xargs.

GNU 사용 xargs:

xargs -a file -I{} -d'\n' command --option {} other args

{}텍스트 줄에 대한 자리 표시자입니다.

다른 것들은 일반적으로 가 xargs없지만 일부는 NUL로 구분된 입력을 가지고 있습니다. 이를 통해 다음을 수행할 수 있습니다.-a-d-0

< file tr '\n' '\0' | xargs -0 -I{} command --option {} other args

Unix 호환 시스템( -IPOSIX에서는 선택 사항, UNIX 호환 시스템에만 해당)에서는 입력을 전처리해야 합니다.인용하다예상되는 형식의 행 xargs:

< file sed 's/"/"\\""/g;s/.*/"&"/' |
  xargs -E '' -I{} command --option {} other args

그러나 일부 xargs구현에서는 인수의 최대 크기에 대한 제한이 매우 낮습니다(예: Unix 사양에서 허용하는 최소값인 Solaris의 경우 255).

답변2

while read루프를 사용하십시오 .

: > another_file  ## Truncate file.

while IFS= read -r line; do
    command --option "$line" >> another_file
done < file

또 다른 방법은 출력을 청크로 리디렉션하는 것입니다.

while IFS= read -r line; do
    command --option "$line"
done < file > another_file

마지막으로 파일을 엽니다.

exec 4> another_file

while IFS= read -r line; do
    command --option "$line" >&4
    echo xyz  ## Another optional command that sends output to stdout.
done < file

명령 중 하나가 입력을 읽는 경우 명령이 입력을 먹지 않도록 입력에 다른 fd를 사용하는 것이 좋습니다(이것은 대신 ksh휴대용 대안이 사용된다고 가정 합니다 ).zshbash-u 3<&3

while IFS= read -ru 3 line; do
    ...
done 3< file

최종적으로 매개변수를 승인하려면 다음을 수행하십시오.

#!/bin/bash

file=$1
another_file=$2

exec 4> "$another_file"

while IFS= read -ru 3 line; do
    command --option "$line" >&4
done 3< "$file"

어느 것이 다음과 같이 실행될 수 있습니까?

bash script.sh file another_file

추가 생각. 와 함께 bash사용 readarray:

readarray -t lines < "$file"

for line in "${lines[@]}"; do
    ...
done

참고: IFS=행 값에서 선행 및 후행 공백을 제거해도 괜찮다면 이 항목을 생략할 수 있습니다.

답변3

이 질문에 정확하게 답하십시오.

#!/bin/bash

# xargs -n param sets how many lines from the input to send to the command

# Call command once per line
[[ -f $1 ]] && cat $1 | xargs -n1 command --option

# Call command with 2 lines as args, such as an openvpn password file
# [[ -f $1 ]] && cat $1 | xargs -n2 command --option

# Call command with all lines as args
# [[ -f $1 ]] && cat $1 | xargs command --option

답변4

    sed "s/'/'\\\\''/g;s/.*/\$* '&'/" <<\FILE |\
    sh -s -- command echo --option
all of the{&}se li$n\es 'are safely shell
quoted and handed to command as its last argument
following --option, and, here, before that echo
FILE

산출

--option all of the{&}se li$n\es 'are safely shell
--option quoted and handed to command as its last argument
--option following --option, and, here, before that echo

관련 정보