Chinaunix
标题:
sed 获取第一个匹配的段落
[打印本页]
作者:
wdfwdf2727
时间:
2019-12-17 16:24
标题:
sed 获取第一个匹配的段落
本帖最后由 wdfwdf2727 于 2019-12-17 16:37 编辑
aaaaa1=
(aaaaa=
)
aaaaa=
(cccccc=
(bbbbbb=
)
)
aaaaa=
(cccccc=
(bbbbbb=
(dddddd=
)
)
数据结构如上
1、每一个段落的开头为字母(有大小写之分),比如 aaaaa1= 就是段落的开头
2、段落内的内容都是非字母开头的,比如 ( 或空格开头,并且存在空行。
3、段落的开头有可能重复,对于重复的开头,只需要取第一个匹配的段落。
现在需要把段落之间的取出来,就是把以 匹配字母开头到下一个匹配字幕开头,比如查找 ^aaaaa1 匹配到如下
aaaaa1=
(aaaaa=
)
求大神帮忙
作者:
cjaizss
时间:
2019-12-24 22:35
本帖最后由 cjaizss 于 2019-12-25 12:07 编辑
#!/bin/bash
sed -nr '
/\<'$2'\>/!d
x
s/.*/\n/
x
s/.*(\<'$2'\>)/\n\1/
:newline
H
x
:seg
s/(\n)([^()]*)([^\n]*)$/\2\1\3/
/(.*)(\n)(\()([^\n]*)$/ {
s//1\1\3\2\4/
tseg
}
/^1(.*)(\n)(\))([^\n]*)$/ {
s//\1\3\2\4/
/^\n/ {
s/\n+(.*)\n[^\n]*$/\1/p
q
}
tseg
}
/^\n(.*)\n\)([^\n]*)$/ {
s//\1/p
q
}
s/\n$//
x
n
s/^/\n/
tnewline
' $1
复制代码
./test.sh urfile aaaaa1
测试中发现某种情况下会加一个空行,属于小BUG,因为空格空行不影响实际内容,但是现在想不起例子。测试如下:
user@ubuntu:/tmp$ cat testfile
abc=( def = (ghijk = (lmn opq))
) ABC=( DE =(FG= (HIJK =
(OPQ RST)
)
)) aBc = (dEF = (
ghI jK))
user@ubuntu:/tmp$ ./test.sh testfile abc
abc=( def = (ghijk = (lmn opq))
)
user@ubuntu:/tmp$ ./test.sh testfile ABC
ABC=( DE =(FG= (HIJK =
(OPQ RST)
)
))
user@ubuntu:/tmp$ ./test.sh testfile dEF
dEF = (
ghI jK)
user@ubuntu:/tmp$ ./test.sh testfile aBc
aBc = (dEF = (
ghI jK))
复制代码
作者:
moperyblue
时间:
2019-12-25 10:56
sed '/^aaaaa1=/,/^[a-zA-Z]/{0,//b;//!b;//Q};d' a.txt
复制代码
作者:
Looiml
时间:
2020-02-27 17:49
sed -n '/^aaaaa1=/{:a;p;n;/^[a-zA-Z]/Q;ba}' a.txt
复制代码
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2