操纵TXT搜索三种模式(SED,AWK,PCREGREP)



我有这个文本文件

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

之间提取TXT

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

最新更新