sed 및 루프를 사용하여 파일을 인수로 전달

sed 및 루프를 사용하여 파일을 인수로 전달

여기서 File1은 템플릿입니다. 파일 2는 스크립트 이름, 작업 이름, 템플릿 이름, 위치 열을 포함하는 200개의 행이 있는 csv입니다
. 템플릿 이름은 파일 2의 열입니다.

다음과 같이 하면 되나요? 목적은 file2의 다른 줄에 대해 (file1의) 다른 템플릿을 사용하는 것입니다.
플라이 2 행에서 $templatename을 변경하고 싶은데 도움을 주셔서 감사합니다 . 가능합니까? 다음은 작동하지 않습니다:

  • 샘플 파일 1

scriptname

statments go here

change jobname

위치 폴더에 저장(이미 존재함)

  • 샘플 파일 2

scriptname, jobname, templatename, location

qqqtest,sew-test,/san00/test/file1, /san00/test/

qqqtest,sew-test,/san00/test/file2, /san00/test/

csv를 읽고 다음 업데이트를 수행하여 매번 file1, file2 템플릿 등을 변경하고 싶습니까?

while IFS=, read scriptname jobname templatename location; 
do sed -e "s/scriptname/$scriptname/" \
  -e "s/jobname/$jobname/" $templatename > "$location" 
done < (file2) 

$templatename을 업데이트하는 방법은 무엇입니까?

답변1

원하시는 내용이 무엇인지 잘 모르겠습니다. 하지만 수정해야 할 몇 가지 사항은 알 수 있습니다.

IFS=, read scriptname jobname templatename location쉼표로 구분된 값을 읽습니다. 에서는 file2쉼표 주위에 공백이 있는 경우가 있습니다. 공백은 변수로 끝납니다. 필드 내에 공백이 없는 경우 IFS=', '선택적 공백으로 둘러싸인 쉼표 시퀀스 또는 공백 시퀀스를 구분 기호로 처리하도록 설정합니다. 필드 내부에 공백이 있을 수 있지만 시작이나 끝 부분에는 공백이 없는 경우 file2먼저 전처리하는 것이 좋습니다.

<file2 sed -e 's/^  *//' -e 's/ *, */,/g' -e 's/  *$//' | while IFS=, read …; do …; done

그런데 <(file2)일부 쉘에서는 구문 오류인 반면, 다른 쉘에서는 이것이 file2실행될 명령(프로세스 대체)임을 의미합니다. 네 말 뜻은 <file2.

/스크립트 이름이나 작업 이름에 이 있을 수 있으면 sed명령에 포함되어 sed 구문 오류가 발생합니다. 에 의해 생성된 필드에는 쉼표를 사용할 수 없으므로 sed 명령 구분 기호를 file2사용하십시오 .,s

sed -e "s,scriptname,$scriptname," -e 's,jobname,$jobname,' …

예제 데이터에서 위치는 디렉터리이지만 코드에서는 여기에 출력을 쓰려고 합니다. 위치가 디렉터리인 경우 파일 이름이 필요합니다. $templatename위치가 디렉터리인 것처럼 동일한 파일 이름을 사용하려면 다음을 수행할 수 있습니다.

if [ -d "$location" ]; then
  location="$location/${templatename##*/}"
fi

이러한 파일은 $location동일한 $templatename파일일 수 없습니다. 그렇지 않으면 sed … "$templatename" >"$location"파일이 먼저 잘린 다음 해당 파일에서 읽기 시작합니다. 파일이 동일할 가능성을 허용하려면 sed 출력을 임시 파일에 쓴 다음 해당 위치로 이동하세요. 당신이 가지고 있다면 mkstemp:

location_dir=${location%/*}
tmp=$(TMPDIR=$location_dir mktemp -t)
sed … >"$tmp"
mv -f -- "$tmp" "$location"

관련 정보