我有这个文本文件
AAAA
1234
title example
Lorem Ipsum
FF
AAAA
1234
title example
€330 - Roma
FF
我只想从此文件中提取:
START WITH AAAA
HAS Euro SYmbol
END WITH FF
在这种情况下,我只想匹配
AAAA
1234
title example
€330 - Roma
FF
我尝试了不同的解决方案我用
sed -e '/AAAAs/,/europ/,/FF/!d' testfile.txt
但它在AAAA和FF
之间提取所有TXET我该如何解决?
感谢您的帮助
编辑:
在欧元线和FF之间可能会有一些文字。我不知道有多少行..
AAAA
1234
title example
€330 - Roma
Some text with n, comma symbol etc etc
FF
i wat以在AAAA和FF
sed:
sed -n '/^AAAA/{:a;N;/nFF/!ba; /€/p}' file
如何工作:
-
/^AAAA/
:从AAAA
开始的行 -
:a
:标签a
,用于即将到来的循环 -
N
:将下一行添加到模式空间 -
/nFF/!
:如果找不到newline,则找不到FF
, -
:ba
:循环到a
标签以将下一行添加到模式空间 -
/€/p
:如果找到€
,则输出
编辑:
正如@potong在评论中所建议的那样,使用GNU sed,您也可以使用M
命令在多行模式下匹配您的正则态度:
sed -n '/^AAAA/{:a;N;/^FF/M!ba; /€/p}' file
一种不错的快速方法是将GREP与多个搜索模式使用。因此,满足您的需求:
grep -B3 -A1 -e '€' test.txt
这将找到欧元符号,并在以后打印3行,但是只有在您期望文件保留在相同模式下,即AAAAA和FF时,这才能起作用。下面。
python是一种程序语言,因此它可能需要更多文本,但对于复杂的事物来说更简单。在这里您应该:
- 当您看到AAAA线时开始存储
- 当您看到FF线时结束存储和
- 仅在包含$ 的文本时保留存储的文本
可以在python中翻译为:
with open(infile) as fd:
processing = False
txt = None
euro = None
for line in fd:
if line.strip() == 'AAAA': # start processing
processing = True
txt = ""
euro = False
if processing:
txt += line # store all lines between AAAA and FF
if '€' in line: euro = True # is an € present ?
if line.strip() == 'FF': # stop processing
processing = False
if euro: # only print if a € was found
print(txt)
不像尴尬,grep或sed脚本那样紧凑,而是简单地编写,读取和维护
awk 'NR>5' file
AAAA
1234
title example
€330 - Roma
FF
awk '/xe2x82xac/{printf RS $0}' RS=AAAA file