File1에서 sed 교체를 수행하여 File2 라인의 출력을 수정하는 방법

File1에서 sed 교체를 수행하여 File2 라인의 출력을 수정하는 방법

File1.txt에는 호스트 목록이 포함되어 있습니다.

computer_1
computer_2

File2.txt에는 명령 목록이 포함되어 있습니다...

ping host_name -c 10
dig host_name A host_name AAAA +short 

...호스트에서 실행됩니다. 명령을 실행하기 전에 file2의 문자열을 File1의 실제 호스트 이름 sed -e "s/host_name/$line/" $2으로 바꿉니다. host_name나는 결국 :

ping computer_1 -c 10
dig computer_1 A computer_1 AAAA +short 
ping computer_2 -c 10
dig computer_2 A computer_2 AAAA +short 

이 출력을 명령으로 실행하려면 어떻게 해야 합니까?

나는 다음을 포함하여 성공하지 못한 몇 가지 초보자 접근 방식을 시도했습니다.

while read line; do
    commands="$(sed -e "s/host_name/$line/" $2)"
    eval $commands
done < $1

답변1

나는 그것이 예상대로 작동하지 않는 따옴표 안의 따옴표 문제일 뿐이라고 생각합니다.

코드의 구문 강조 표시는 무슨 일이 일어나고 있는지 힌트를 줍니다. s/host_name/$line/밧줄의 나머지 부분은 빨간색이 아니라 검은색이라는 점에 주목하세요 . 이는 실제로 bash가 이해하지 못하는 일부 쓰레기가 포함된 두 개의 문자열을 생성했기 때문입니다.

이와 같은 것이 작동해야합니다

while read line; do
    commands=$(sed -e "s/host_name/$line/" $2)
    eval "$commands"
done < $1

답변2

while read loopa 와 a를 모두 가질 수 있습니다.for loop

A. 하지만 일명 foor loop이 필요해mapfilereadarray

mapfile -t commands < file2.txt
mapfile -t hosts < file1.txt

for h in "${hosts[@]}"; do
  for c in "${commands[@]}"; do
    echo  command "$c" "$h"
  done
done

bash가 충분히 새롭지 않은 경우 일반적인 해결 방법은 다음과 같습니다.mapfile

IFS=$'\n' read -rd '' -a array < file.txt

또는

while IFS=  read -r file; do
  array+=("$file")
done < file.txt

이제 "${array[@]}"모든 값/요소를 저장하십시오.


주기 while read.

while IFS= read -ru "$fd" h; do
  while IFS= read -r c; do
    echo command "$c" "$h"
  done < file2.txt
done {fd}< file1.txt
  • echo출력이 정확하다고 생각되면 이를 제거하여 실제로 명령을 실행하십시오.
  • 두 파일 모두 한 줄에 하나의 항목이 있다고 가정하면 내장된 것만으로도 command충분합니다. 즉, 한 줄에 여러 명령을 구분할 필요가 없습니다 ;. 다른 점에서는 그렇습니다...eval

  • $fd임의의 이름이고 임의의 파일 설명자를 사용합니다. bash가 충분히 새롭지 않으면 채택된 이후 로 {fd}변경할 수 없습니다 . 루프의 무언가가 식사/흡연인 경우 에는 다른 것을 사용해야 합니다 .302fdwhile readstdinssh

관련 정보