답변:
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
, zsh
나 bash
에 대한 -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=
행 값이 선행 및 후행 공백으로 잘리지 않는 경우 생략 할 수 있습니다.
다른 옵션은 xargs
입니다.
GNU로 xargs
:
< file xargs -I{} -d'\n' command --option {} other args
{}
텍스트 줄의 자리 표시 자입니다.
다른 xargs
것들은 -d
없지만, 일부는 -0
NUL로 구분 된 입력을 가지고 있습니다. 이를 통해 다음을 수행 할 수 있습니다.
< file tr '\n' '\0' | xargs -0 -I{} command --option {} other args
Unix 호환 시스템 ( -I
POSIX에서는 선택 사항이며 Unix 호환 시스템에만 필요)에서 입력을 사전 처리하여 다음 과 같이 예상되는 형식으로 라인 을 인용 해야합니다 xargs
.
< file sed 's/"/"\\""/g;s/.*/"&"/' |
xargs -E '' -I{} command --option {} other args
그러나 일부 xargs
구현의 경우 인수의 최대 크기 (예 : Solaris의 경우 255, Unix 사양에서 허용되는 최소값)에 대한 제한이 매우 낮습니다.
질문을 정확하게 유지 :
#!/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
내가 찾은 가장 좋은 대답은 다음과 같습니다.
for i in `cat`; do "$cmd" "$i"; done < $file
편집하다:
... 4 년 후 ...
몇 차례의 다운 투표와 더 많은 경험을 쌓은 후 다음을 추천합니다.
xargs -l COMMAND < file
do "$cmd" "$i";
이유가없는 한 쉘 변수에 대한 참조를 항상 인용해야 합니다. 파일 *
자체에 단어가 포함되어 있으면 코드가 실행 $cmd *
되며 물론 현재 디렉토리의 파일 목록과 함께 명령이 실행됩니다.
zsh
는이 `cat`
이미 확장 것 *
(인용 부호로 둘러싸이지 않은가 $i
여전히 와일드 카드 (두 번째 라운드)를 확장 할 수있는 경우의 확장을 `cat`
소개하고 일부). 어쨌든 그 접근법은 실제로 잘못되었습니다.
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
ed file.txt
%g/^/s// /
2,$g/^/-,.j
1s/^/command/
wq
chmod 755 file.txt
./file.txt
파일의 모든 줄을 하나의 명령에 대한 인수로 전달하십시오.
command line1 line2 line3 ....
--option
각 행 앞에 플래그가 필요하면 두 번째 명령을 다음과 같이 변경하십시오.
%g/^/s// --option /
'
, "
, <
, >
, ;
, 등 (3)이 불필요한 임시 파일을 생성한다. (4) 이와 같은 것은 일반적으로 "여기 문서"를 사용하여 수행됩니다. (5) 당신의 ed
명령이 서투르다. 처음 두 명령은 %s/^/ /
및 로 줄일 수 있습니다 %j
.
<file xargs -L 1 -I{} command --option {} other args