比如说原文件是:
- Name:"AAA"
- Age:"20"
- Name:"BBB"
- Age:"30"
需要实现
1.匹配所有- Name 这一行
2.提取 name ( AAA/BBB 等)
1-2 步可以用 while read line
3.根据 name 去参考表里面抓取性别
这个用 awk
4.并在其后第 3 行添加一行性别信息
(这个我就不知道了,求助各位)
效果如下:
- Name:"AAA"
- Age:"20"
- Gender:"F"
- Name:"BBB"
- Age:"30"
- Gender:"M"
这种还要救助另一个字典(就是查性别)还是写个脚本去处理吧,比如 py,php 都行,用 awk 硬上的话特别恶心
同时关注大神来补充
原文件是 yml 结构的?这当然是题外话
可以这样(思路,没验证):
sed -i '/^Age(.*)$/Age$1\nGender:"X"/' path/to/file
1 、循环外面做个标记记下行数,读到-Name 时把之前抓取的性别 sed 插入到标记行前就行了
2 、把 Name 后面的换行换成制表符,每行加上制表符之后,逐行加性别,最后替换掉所有的制表符为换行
用 shell 数组实现的一个, lz 可以参考下。
https://gist.github.com/ollyblue/d0d12d628ab39a4b3762
显示 Gist 代码 用 sed 简单实现的...最大的问题在于会多次替换原文件...效率太差...
/>cat test.txt | grep -Po '(?<=Name:").*(?=")' | while read line
do
gender=`get gender from other file`
echo $line
sed -i '/Name:"'"$line"'"/{n;
a\- Gender:"'"$gender"'"
}' test.txt
done
ls 的威武,环视正则,
[[email&~]cat 1.sh
- Name:"AAA"
- Age:"20"
- Name:"BBB"
- Age:"30"
1
[[email&~]awk '/- Name/{print $0}' 1.sh
- Name:"AAA"
- Name:"BBB"
2
[[email&~]awk -F "[: ]+" '/- Name/{print $3}' 1.sh
"AAA"
"BBB"
3 题意看不懂
4
[[email&~]line=$((`grep -n '\- Name:"AAA"' 1.sh|awk -F: '{print $1}'`+2));sed -i "$line i - Gender:"F"" 1.sh
[[email&~]cat 1.sh
- Name:"AAA"
- Age:"20"
- Gender:F
- Name:"BBB"
- Age:"30"
楼主看看行吗
https://gist.github.com/Arthur2e5/c1d9172025068b07b44f 显示 Gist 代码