我有这样的文本文件:
qwery 45
uiopbmc 6
uenja 9999
comxq 8
我想说:
mylist=['a','c']
if last letter in the line is 'a' (before the number) and the first letter in the next line is 'c', print both two lines.
结果:
uenja 9999
comxq 8
我知道 sed 中的第一行如“s/”,但我如何说出数字之前的最后一个字母和下一行的第一个字母?
答案1
sed -n '1N;/a .*\nc/p;N;D'
将报告包含"a "
后跟以 . 开头的行的行"c"
。
也可以看看:
sed -n '1N;/a[^[:alpha:]]*\n[^[:alpha:]]*c/p;N;D'
匹配a
最后一个信¹ 在第一行中,对于第二行,其中第一行信是c
。
请注意,在这样的输入上:
xa 123
c1a 234
c2a 345
它报告了:
xa 123
c1a 234
和
c1a 234
c2a 345
两者都符合要求。
严格来说,尽管α名称,它不限于字母表中的字母,[[:alpha:]]
匹配构成人类语言单词的字符,无论它们是拉丁语或希腊语等字母表还是不像汉字......至少在 GNU 系统上,你会发现它也匹配 0123456789 以外的数字以满足冲突的 POSIX/C 标准要求: alnum = alpha + digital,但该数字仅限于 0123456789。
答案2
和awk
:
# first field ends with 'a' and next line starts with 'c'
# i.e. current line starts with 'c' and previous line's first field ends with 'a'
$ awk 'p1 ~ /a$/ && /^c/{print p0; print} {p1=$1; p0=$0}' ip.txt
uenja 9999
comxq 8
借鉴 Stéphane Chazelas 的意见回答:
$ cat ip.txt
xa 123
c1a 234
c2a 345
$ awk 'p1 ~ /a$/ && /^c/{print p0; print} {p1=$1; p0=$0}' ip.txt
xa 123
c1a 234
c1a 234
c2a 345
在这种情况下,中间行将打印两次(一次作为c
在开头的匹配,另一次作为a
在第一个字段末尾的匹配)。
答案3
使用sed
$ sed -En '/^[^ ]*a/{N;/\nc/p}' input_file
uenja 9999
comxq 8