파일에서 텍스트 문자열을 추출하여 변수에 할당한 다음 다른 파일에 쓰시겠습니까?

파일에서 텍스트 문자열을 추출하여 변수에 할당한 다음 다른 파일에 쓰시겠습니까?

기본적으로는 게임 서버(마인크래프트)인데, 새로운 세계 생성을 자동화하려는 상황에 봉착하고 있습니다. 기본적으로 이 코드 조각이 포함된 파일이 성공적으로 생성되었습니다.

파일 1.txt

keepSpawnInMemory: 'true'
spawnLocation:
  ==: MVSpawnLocation
  yaw: 0.0
  pitch: 0.0
  z: 256.5
  y: 62.0
  x: -223.5
autoLoad: 'true'
bedRespawn: 'true'

이것은 잘 작동하지만 z: 256.5, y: 62.0 및 x: -223.5를 별도로 추출한 다음 다음 줄을 사용하여 file2.txt라는 파일을 작성해야 합니다.

 world: mine
 x: -223.5
 y: 62.0
 z: 256.5
 yaw: 0.0
 pitch: 0.0
 name: mine

awk와 같은 것을 사용하여 초기 숫자를 추출하고 변수에 할당한 다음 파일에 쓸 것이라고 가정합니다. 저는 awk를 한번도 사용해본 적이 없어서 매우 혼란스럽습니다. 도움을 주신 분들께 감사드립니다. 나는 Ubuntu Linux, bash 스크립트를 사용합니다. awk와 bash를 사용하여 이와 같은 텍스트를 추출하고 변수로 변환할 수 있나요?

편집하다:

파일 1에 x, y, z의 여러 인스턴스가 있다는 사실을 언급하는 것을 잊었습니다. 여기에서 액세스할 수 있습니다:http://pastebin.com/TqaLcWzV

특정 줄부터 시작하는 방법이 있나요? 예를 들어, z, y, x는 항상 각각 183, 184, 185행에 있습니다.

답변1

다음 스크립트를 사용해 보세요.

#!/bin/bash

FILE1=/path/to/file1
FILE2=/path/to/file2

#extracting lines 183 to 185
FILE1=$(awk 'FNR>=183&&FNR<=185' $FILE1)

#extracting variables    
Z=$(echo "$FILE1" | grep z: | awk '{print $2}')
Y=$(echo "$FILE1" | grep y: | awk '{print $2}')
X=$(echo "$FILE1" | grep x: | awk '{print $2}')
#YAW=$(echo "$FILE1" | grep yaw: | awk '{print $2}')
#PITCH=$(echo "$FILE1" | grep pitch: | awk '{print $2}')

cat <<EOF > $FILE2
 world: mine
 x: $X
 y: $Y
 z: $Z
 yaw: 0.0
 pitch: 0.0
 name: mine
EOF

요(yaw)와 피치(pitch)도 추출하려면 다음을 수행하십시오.

  • 181번째 줄에서 추출하도록 awk 줄을 변경합니다.

    FILE1=$(awk 'FNR>=181&&FNR<=185' $FILE1)
    
  • 주석 해제 YAWPITCH

  • 맨 아래의 Yaw: 및 Pitch:를 다음으로 변경합니다.

    yaw: $YAW
    pitch: $PITCH
    

답변2

정말 필요해?분배하다변수의 값은? 이러한 variable: value쌍은 입력과 출력에서 ​​동일하게 나타나므로 텍스트로만 추출할 수 있습니다.

$ awk '/mine:/,/allowFlight/ {if ($1 ~ /^[xyz]:/) print;}' file1.txt
      z: 256.5
      y: 62.0
      x: -223.5

명령 대체를 사용하여 여기 문서에 직접 넣을 수 있다고 생각합니다.

cat > file2.txt << EOF 
 world: mine
$(awk '/mine:/,/allowFlight/ {if ($1 ~ /^[xyz]:/) print " "$1,$2;}' file1.txt)
 yaw: 0.0
 pitch: 0.0
 name: mine
EOF

print " "$1,$2(저는 출력을 약간 더 예쁘게 만들기 위해 대신 simple을 사용했습니다 print).

관련 정보