如何删除不在引号或括号中的文本?

Tux*_*ife 6 python command-line bash perl sed

输入:

19. "foo foo" (bar bar) (19) raboof
"foo foo" raboof
Run Code Online (Sandbox Code Playgroud)

预期输出:

"foo foo" (bar bar) (19)
"foo foo"
Run Code Online (Sandbox Code Playgroud)

如您所见,我想保留双引号和括号。

应删除不在双引号或括号之间的所有内容。

hee*_*ayl 10

使用python

#!/usr/bin/env python2
import re, sys
with open(sys.argv[1]) as f:
    for line in f:
        parts = line.split()
        for i in parts:
            if re.search(r'^[("].*[)"]$', i):
                print i,
        print '\n'.lstrip()
Run Code Online (Sandbox Code Playgroud)

输出:

"foo" (bar) (19) 
"foo"
Run Code Online (Sandbox Code Playgroud)
  • 读取每一行,并将空格分隔的部分保存到名为 parts

  • 然后使用re模块的search功能,我们发现,无论是用在开头部分"(与最终无论是")

如何运行:

将脚本另存为例如script.py. 现在您可以通过两种方式运行它:

  • 使其可执行chmod u+x /path/to/script.py并运行它,/path/to/script.py /path/to/file.txt即输入文件file.txt作为第一个参数。如果脚本和文件都在同一目录中,则从该目录./script.py file.txt

  • 您可以在不使其可执行的情况下运行它,将其作为python2 script.py file.txt.

回答编辑后的问题:

#!/usr/bin/env python2
import re, sys
with open(sys.argv[1]) as f:
    for line in f:
        print ''.join(re.findall(r'(?:(?<=\s)["(].*[")](?=\s|$)|(?<=^)["(].*[")](?=\s|$))', line))
Run Code Online (Sandbox Code Playgroud)

输出:

"foo foo" (bar bar) (19)
"foo foo"
Run Code Online (Sandbox Code Playgroud)


Syl*_*eau 5

新版本()或之间允许有空格""):

试试下面的perl命令(学分:@ steeldriver

perl -ne 'printf "%s\n", join(" " , $_ =~ /["(].*?[)"]/g)'
Run Code Online (Sandbox Code Playgroud)

初始版本()或之间没有空格""

您可以尝试以下perloneliner:

$ perl -ne '@a=split(/\s+/, $_); for (@a) {print "$_ " if /[("].*?[)"]/ };print"\n"'  file
Run Code Online (Sandbox Code Playgroud)

  • 简短,它有效+1 ;) (4认同)