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

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

输入:

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$trtr$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"


这就是原始任务

输入:

  1. “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"

相关内容