基本上,它是一个游戏服务器(我的世界),我遇到了一种情况,我正在尝试自动化新世界的生成。基本上,我有一个很高兴生成的文件,其中包含此代码片段。
文件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
如果您希望它也提取偏航和俯仰:
更改 awk 行以从第 181 行提取:
FILE1=$(awk 'FNR>=181&&FNR<=185' $FILE1)
取消注释
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
(我使用而不是简单的稍微美化了输出print
)。