여기서 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"