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)
新版本(()或之间允许有空格""):
试试下面的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)