【发布时间】:2019-02-11 21:44:08
【问题描述】:
我需要提取文件中所有用单引号括起来的字符串。例如,如果一个文件包含以下行:
"Julius" was not "Ceaser"
应该输出
Julius
Ceaser
我想使用 bash (Sed/Awk) 来实现。使用 awk 我可以提取一个匹配项,但如何获取所有字符串?
【问题讨论】:
-
单引号和双引号之间有一个重要的区别。您发布的是双引号。
我需要提取文件中所有用单引号括起来的字符串。例如,如果一个文件包含以下行:
"Julius" was not "Ceaser"
应该输出
Julius
Ceaser
我想使用 bash (Sed/Awk) 来实现。使用 awk 我可以提取一个匹配项,但如何获取所有字符串?
【问题讨论】:
awk 来救援!
$ awk -v RS='"' '!(NR%2)' file
Julius
Ceaser
使用此内容
$ cat file
我需要提取文件中所有用单引号括起来的字符串。例如,如果文件包含以下行:“Julius” 不是“Ceaser” 它应该输出 Julius Ceaser
假设没有转义引号。
【讨论】:
grep -Eo '"[a-zA-Z]+"' file
将在不同的行上打印匹配的字符串,即使它们在原始文件中的同一行上。如果你想折叠火柴,你可以这样做:
grep -nEo '"[a-zA-Z]+"' file | awk -F: '
BEGIN { p=1 }
{
gsub("\"", "", $2)
n=$1;
if (p != n) {
print s; s = $2; p=n
} else {
if(s) { s = s" "$2 } else { s=$2 }
}
}
END {
print s
}'
grep -nEo 只提取匹配的部分,以行号为前缀【讨论】:
"[^"]+" 更具包容性。
如果你想在同一行打印所有双引号字符串,那么试试这个 Perl one-liner
perl -ne ' while(/("\S+")/g) { print "$1 " } print "\n" '
有给定的输入
$ cat doubleq.txt
"Julius" was not "Ceaser"
"request" map url
"Ceaser"
$ perl -ne ' while(/("\S+")/g) { print "$1 " } print "\n" ' doubleq.txt
"Julius" "Ceaser"
"request"
"Ceaser"
$
【讨论】:
如果您不介意包含引号的输出,则简单的 grep -o 可能会起作用:
$ egrep -o '"[[:alnum:]]+"' <<<'"Julius" was not "Ceaser"'
"Julius"
"Ceaser"
如果您不想要引号,grep -P(主要在 Linux 上)或 pcregrep(FreeBSD、macOS 和其他 BSD)可能会工作,使用负向后和向前看:
$ pcregrep -o '(?<=")[[:alnum:]]+(?=")' <<<'"Julius" was not "Ceaser"'
Julius
Ceaser
【讨论】: