포맷을 위해 sed 출력을 printf로 파이프하는 방법은 무엇입니까?

포맷을 위해 sed 출력을 printf로 파이프하는 방법은 무엇입니까?

풍동 데이터를 처리하기 위해 Tecplot을 사용하고 있지만 Tecplot에 대한 입력에는 변수를 지정하기 위한 특정 형식이 필요합니다. 각 변수는 큰따옴표로 묶여 있습니다 "Variable Name". 문제는 큰따옴표를 얻는 것이 쉽지 않다는 것입니다. printf ' "%s" '이런 효과를 낼 수 있는 기사를 찾았습니다 . 그러나 printf는 입력 내용에 대해 매우 까다롭습니다. sed를 사용하기 전에 데이터 파일에서 변수를 전송할 수 없었지만 printf를 사용한다고 설명하는 다른 기사를 찾았습니다 printf ' "%s" ' $(sed ...). 이 구조는 작동하지만 내 문제에 대한 해결책은 절반뿐입니다. 이제 출력을 사용하여 자리 표시자(XYZXYZXYZ)를 로 변환 printf하고 싶습니다 .sedprintf ' "%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추신: 문자열 주위에 큰따옴표만 필요하므로 사용을 무시하십시오 .

관련 정보