我有这个文件
something1
something2 username": "John" something3
something4
....
something5 salaryunit="dollar" something6
something7
我想得到这个结果
John dollar
或
username": "John" salaryunit="dollar"
我试过
grep -oP 'username":".*?"\|salaryunit=".*?"' file
但它会出错。怎么了?
答案 0 :(得分:0)
给定grep
版本(例如GNU grep
),支持-P
选项启用的PCRE(Perl兼容正则表达式)并支持-o
}选项只打印匹配的东西 - 这两者都不是POSIX规定的 - 那么你需要在管道之前删除反斜杠,并在问题中命令的第二个双引号之前添加一个空格。
给定数据文件:
something1
something2 username": "John" something3
something4
....
something5 salaryunit="dollar" something6
something7
username": "John" salaryunit="dollar"
运行显示的命令会产生显示的输出:
$ grep -oP 'username": ".*?"|salaryunit=".*?"' file
username": "John"
salaryunit="dollar"
username": "John"
salaryunit="dollar"
$
请注意,当模式在单行输入(样本数据中的最后一行)上匹配两次时,-o
选项会在两个单独的行上输出两个单独的匹配项。当匹配输入位于两条不同的行上时,当然输出也在两条不同的行上。
如果您要求输出单行',则需要指定所需的扩充文件输出,或者文件的变体,其中包含20个通过该文件传播的匹配项。如果您想成对使用它们,如果两个salaryunit
条目之间没有username
,或者两个username
条目之间没有salaryunit
,会发生什么?等
如果你确信这些条目总是成对出现,并且始终在username
然后salaryunit
的序列中,那么将一对行组合成单行的简单方法是:
$ grep -oP 'username": ".*?"|salaryunit=".*?"' file | paste -d ' ' - -
username": "John" salaryunit="dollar"
username": "John" salaryunit="dollar"
$
对- -
的{{1}}表示法意味着从标准输入读取一行,然后再读取一行,并将该组合打印为单行'。默认情况下,行由制表符分隔;使用paste
意味着他们会被一个空格分开。使用较长的分隔符不起作用;第一个字符用于分隔前两个字段,字符串中的第二个字符分隔第二个和第三个字段,依此类推。