首页 > 解决方案 > 如何在bash中格式化文本文件中的变量?

问题描述

我已经坚持了一段时间,并尝试了很多方法但无法使其工作。

假设我有一个文本文件,内容如下

mark_line
variable1
value1
value2
mark_line
variable2
value3
mark_line
variable3
value4
value5
value6
value7
mark_line
...
...
mark_line

依此类推,基本上在每个mark_line之间,第一行是变量名,其余是该变量的值,可以是一行或多行

期望输出变得像

变量 1="值 1 值 2"

变量2="值3"

variable3="value4 value5 value6 value7"

等等 ...

我认为这将需要一段时间for loop ,但我无法找到正确的方法。

任何提示或想法将不胜感激。

标签: linuxbashshellposix

解决方案


仅根据生成一堆赋值语句的要求(但不一定执行所述语句),我们将从示例数据文件开始:

$ cat mark_line.dat
mark_line
variable1
value1
value2
mark_line
variable2
value3
mark_line
variable3
value4
value5
value6
value7
mark_line
variable4
value8
mark_line
mark_line
mark_line

接下来是一段代码,它将变量/值条目打印到一行,仅当我们看到一个条目时才awk生成一个换行符 ( ):\nmark_line

$ awk '
/mark_line/ { printf "\n" ; next }
            { printf $0" "}
' mark_line.dat

<blank_line>
variable1 value1 value2
variable2 value3
variable3 value4 value5 value6 value7
variable4 value8
<blank_line>
<blank_line>

然后,我们将解析出空行,并有一个while循环将等号和双引号添加到我们的输出中:

$ awk '/mark_line/ { printf "\n" ; next } { printf $0" "}' mark_line.dat | \
egrep -v '^$' | \
while read -r myvar myvals
do
    echo "${myvar}=\"${myvals}\""
done

variable1="value1 value2"
variable2="value3"
variable3="value4 value5 value6 value7"
variable4="value8"

注意:此解决方案假定每个variable?都至少有一个value?与之关联,否则variable?没有至少一个value?将生成输出:variable5=""

从这里我假设 OP 已经制定了如何使用此输出的计划(例如,也许eval根据@kaylum 的评论使用命令?)。


推荐阅读