Bash 如何获取文件中所有带引号的字符串?

Bash 如何获取文件中所有带引号的字符串?,bash,awk,sed,Bash,Awk,Sed,我需要提取文件中所有用单引号括起来的字符串。例如,如果文件包含以下行: "Julius" was not "Ceaser" 它应该输出 Julius Ceaser 我想使用bash-Sed/Awk来完成它。使用Awk我可以提取一个事件,但是如何获取所有字符串 grep -Eo '"[a-zA-Z]+"' file 将在单独的行上打印匹配字符串,即使它们在原始文件的同一行上。如果要折叠火柴,可以执行以下操作: grep -nEo '"[a-zA-Z]+"' file | awk -F: '

我需要提取文件中所有用单引号括起来的字符串。例如,如果文件包含以下行:

"Julius" was not "Ceaser"
它应该输出

Julius 
Ceaser
我想使用bash-Sed/Awk来完成它。使用Awk我可以提取一个事件,但是如何获取所有字符串

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只提取匹配的部分,行号前缀为 awk解析grep的输出并生成所需的结果 将在单独的行上打印匹配字符串,即使它们在原始文件的同一行上。如果要折叠火柴,可以执行以下操作:

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只提取匹配的部分,行号前缀为 awk解析grep的输出并生成所需的结果 救命啊

$ awk -v RS='"' '!(NR%2)' file

Julius
Ceaser
使用此内容

$ cat file
我需要提取文件中所有用单引号括起来的字符串。例如,如果文件包含以下行:Julius 它不应该输出朱利叶斯·凯瑟吗

假设没有转义的引号。

awk to the rescue

$ awk -v RS='"' '!(NR%2)' file

Julius
Ceaser
使用此内容

$ cat file
我需要提取文件中所有用单引号括起来的字符串。例如,如果文件包含以下行:Julius 它不应该输出朱利叶斯·凯瑟吗


假定没有转义引号。

如果要在同一行中打印所有双引号字符串,请尝试使用此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"

$

如果要在同一行中打印所有双引号字符串,请尝试使用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-o可能会起作用:

$ egrep -o '"[[:alnum:]]+"'  <<<'"Julius" was not "Ceaser"'
"Julius"
"Ceaser"

单引号和双引号之间有一个重要的区别。你发布的是双引号。单引号和双引号之间有一个重要的区别。您发布的是双引号。如果一行有多个带引号的字符串,此解决方案将它们打印在不同的行上。不确定OP是否需要。也许,但问题是输出是如何显示的。如果一行有多个带引号的字符串,此解决方案将它们打印在不同的行上。不确定OP是否需要。也许吧,但问题是输出是如何显示的。您可能需要修剪引号。也可能[^]+更具包容性。您可能需要修剪引号。也许[^]+更具包容性。