[Shell] 怎样在匹配的行的下一行/下 N 行插入内容?

2015-10-09 09:48:05 +08:00
 jiaslbang

比如说原文件是:
- 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"

5394 次点击
所在节点    Linux
8 条回复
morefreeze
2015-10-09 10:00:32 +08:00
这种还要救助另一个字典(就是查性别)还是写个脚本去处理吧,比如 py,php 都行,用 awk 硬上的话特别恶心
同时关注大神来补充
imdjh
2015-10-09 10:00:40 +08:00
原文件是 yml 结构的?这当然是题外话
可以这样(思路,没验证):
sed -i '/^Age(.*)$/Age$1\nGender:"X"/' path/to/file
zhantss
2015-10-09 10:30:35 +08:00
1 、循环外面做个标记记下行数,读到-Name 时把之前抓取的性别 sed 插入到标记行前就行了

2 、把 Name 后面的换行换成制表符,每行加上制表符之后,逐行加性别,最后替换掉所有的制表符为换行
joyeblue
2015-10-09 10:52:36 +08:00
用 shell 数组实现的一个, lz 可以参考下。

https://gist.github.com/ollyblue/d0d12d628ab39a4b3762
yangtukun1412
2015-10-09 11:56:35 +08:00
用 sed 简单实现的...最大的问题在于会多次替换原文件...效率太差...

#!/bin/bash
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
henryon
2015-10-09 13:09:29 +08:00
ls 的威武,环视正则,
rootit
2015-10-11 23:30:35 +08:00
[root@ALS_Free ~]# cat 1.sh
- Name:"AAA"
- Age:"20"
- Name:"BBB"
- Age:"30"

1
[root@ALS_Free ~]# awk '/- Name/{print $0}' 1.sh
- Name:"AAA"
- Name:"BBB"

2
[root@ALS_Free ~]# awk -F "[: ]+" '/- Name/{print $3}' 1.sh
"AAA"
"BBB"

3 题意看不懂

4
[root@ALS_Free ~]# line=$((`grep -n '\- Name:"AAA"' 1.sh|awk -F: '{print $1}'`+2));sed -i "$line i - Gender:"F"" 1.sh
[root@ALS_Free ~]# cat 1.sh
- Name:"AAA"
- Age:"20"
- Gender:F
- Name:"BBB"
- Age:"30"

楼主看看行吗
Arthur2e5
2015-11-02 06:46:02 +08:00
https://gist.github.com/Arthur2e5/c1d9172025068b07b44f

就这样, awk 部分我也不知道你文件长怎样自己补吧。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/226520

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX