풍동 데이터를 처리하기 위해 Tecplot을 사용하고 있지만 Tecplot에 대한 입력에는 변수를 지정하기 위한 특정 형식이 필요합니다. 각 변수는 큰따옴표로 묶여 있습니다 "Variable Name"
. 문제는 큰따옴표를 얻는 것이 쉽지 않다는 것입니다. printf ' "%s" '
이런 효과를 낼 수 있는 기사를 찾았습니다 . 그러나 printf는 입력 내용에 대해 매우 까다롭습니다. sed
를 사용하기 전에 데이터 파일에서 변수를 전송할 수 없었지만 printf
를 사용한다고 설명하는 다른 기사를 찾았습니다 printf ' "%s" ' $(sed ...)
. 이 구조는 작동하지만 내 문제에 대한 해결책은 절반뿐입니다. 이제 출력을 사용하여 자리 표시자(XYZXYZXYZ)를 로 변환 printf
하고 싶습니다 .sed
printf ' "%s" ' $(sed ...)
's
sed s/XYZXYZXYZ/` printf ' "%s" ' $(sed -n 1,265p Run-0020) `/ ../../wt/wt-layout_A.dat
sed: -e expression #1, char 12: unterminated `s' command
설명된 대로 XYZXYZXYZ를 printf의 출력으로 어떻게 변경합니까?
답변1
printf
명령을 큰따옴표로 묶어보세요 . $(…)
명령 대체 구문을 사용 하고 sed
명령에 작은따옴표를 추가하면 다음과 같습니다.
sed 's/XYZXYZXYZ/'"$(printf ' "%s" ' $(sed -n '1,265p' Run-0020))"/ ../../wt/wt-layout_A.dat
printf
명령에서 첫 번째 공백 문자를 제거하여 이를 로 변경할 수 있습니다 printf '"%s" '
.
답변2
문제는 .NET에서 문자열을 여러 줄의 출력으로 바꾸려고 한다는 것입니다 sed
. 대체 문자열에는 개행 문자가 포함될 수 없습니다. 다음과 같이 인코딩해야 합니다.\n
한 가지 해결 방법은 대체 문자열의 개행 문자를 특이한 문자로 인코딩한 다음 다시 디코딩하는 것입니다. 중간에 필요한 곳에 따옴표를 추가하면 됩니다.
sed \
#replace newlines in input with END OF TEXT byte as separator
#not using NUL byte as many shells ignore them
#ignore newline on last entry
-e "s/XXX/$(sed -n 1,265p RUNFILE | tr '\n' '\03' | sed 's/\x03$//' )" \
#replace new separator by "<separator>", as well addin " at beginning and end of line
-e 's/\x03/"\0"/g;s/^/"/;s/$/"/'
#reintroduce newlines
-e 's/\x03/\n/g' LAYOUTFILE > OUTPUT
입력 샘플
$cat LAYOUTFILE
XXX
$cat RUNFILE
1
....
300
$cat OUTPUT
"1"
....
"265"
printf
추신: 문자열 주위에 큰따옴표만 필요하므로 사용을 무시하십시오 .