输入:
19. "foo foo" (bar bar) (19) raboof
"foo foo" raboof
预期输出:
"foo foo" (bar bar) (19)
"foo foo"
正如您所看到的,我想保留双引号和括号。
不在双引号或括号之间的所有内容都应被删除。
答案1
使用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()
输出:
"foo" (bar) (19)
"foo"
读取每一行并将用空格分隔的部分保存到名为
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))
输出:
"foo foo" (bar bar) (19)
"foo foo"
答案2
新版本(()
或之间允许有空格""
):
尝试以下perl
命令(来源:@钢铁司机)
perl -ne 'printf "%s\n", join(" " , $_ =~ /["(].*?[)"]/g)'
初始版本()
(或之间没有空格""
)
您可以尝试以下perl
一行代码:
$ perl -ne '@a=split(/\s+/, $_); for (@a) {print "$_ " if /[("].*?[)"]/ };print"\n"' file
答案3
如果您(或遇到类似问题并阅读本文的其他人)不需要保留换行符,则以下方法可行:
grep -Eo '"[^"]*"|\([^)]*\)'
对于输入
19. "foo foo" (bar bar) (19) raboof
"foo foo" raboof
它产生输出
"foo foo"
(bar bar)
(19)
"foo foo"
如果需要换行符,可以使用一些技巧,例如:
sed 's/$/\$/' \
| grep -Eo '"[^"]*"|\([^)]*\)|\$$' \
| tr '\n$' ' \n' \
| sed 's/^ //'
第一个在每一行的末尾sed
添加一个。(您可以使用任何字符。)第二个与上面的几乎相同,但现在也匹配行尾,因此它匹配每一行的末尾。将换行符转换为空格,将美元转换为换行符。但由于之前的输出后面跟着换行符,因此之后的输出将有换行符和空格。最后一个删除了这些空格。$
grep
$
tr
tr
$
sed
答案4
脚本如下perl
:
$filename=$ARGV[0];
if (open(my $fh, '<:encoding(UTF-8)', $filename)) {
while (my $match = <$fh>) {
while ($match =~ /((\(.*?[^)]\))|(".*?"))/g) {
print "$1 ";
}
print "\n"
}
}
或者perl
单行:
perl -ne 'while (/((\(.*?[^)]\))|(".*?"))/g) {print "$1 ";} print "\n"' file
输出
"foo foo" (bar bar) (19)
"foo foo"
这就是原始任务:
输入:
- “foo” (酒吧) (19)
拉布夫“foo”拉布夫
预期输出:
“foo” (酒吧) (19)
“foo”
使用perl
:
perl -pe '@elements=( split (/\s/) );
for $element (@elements) {
if ($element!~/^"|\(/ and $element!~/"|\($/) {
s/$element//
}
s/^\s+//;
s/\s+$/\n/
};' file
或者单行:
perl -pe '@elements=( split (/\s/) ); for $element (@elements) { if ($element!~/^"|\(/ and $element!~/"|\($/) { s/$element// } s/^\s+//; s/\s+$/\n/ };' file
输出:
"foo" (bar) (19)
"foo"