linux - 如何在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 ,但我无法找到正确的方法。
任何提示或想法将不胜感激。
解决方案
仅根据生成一堆赋值语句的要求(但不一定执行所述语句),我们将从示例数据文件开始:
$ 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
生成一个换行符 ( ):\n
mark_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 的评论使用命令?)。
推荐阅读
- go - 无法通过 Testify Mock 对象错误
- python - 将 numpy 32int 保存到多层 tiff
- bash - 无法使用 shell 脚本以所需格式输出值
- perl - 尝试将变量输入 url 并遇到编码问题
- angular - 我们如何遍历表单组中的各个表单控件?
- c# - 以编程方式最大化无边框窗口
- swift - Swift 警告:“弱”不应应用于协议中的属性声明
- python - 在numpy中计算两个矩阵的行之间的角度
- php - How to generate increment number for each group of data?
- linux - Understanding awk command usage while passing a file content in it