【问题标题】:How to get all the quoted strings in a file?如何获取文件中所有带引号的字符串?
【发布时间】:2019-02-11 21:44:08
【问题描述】:

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

"Julius" was not "Ceaser"

应该输出

Julius 
Ceaser

我想使用 bash (Sed/Awk) 来实现。使用 awk 我可以提取一个匹配项,但如何获取所有字符串?

【问题讨论】:

  • 单引号和双引号之间有一个重要的区别。您发布的是双引号。

标签: bash awk sed


【解决方案1】:

awk 来救援!

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

Julius
Ceaser

使用此内容

$ cat file

我需要提取文件中所有用单引号括起来的字符串。例如,如果文件包含以下行:“Julius” 不是“Ceaser” 它应该输出 Julius Ceaser

假设没有转义引号。

【讨论】:

  • 如果一行有多个带引号的字符串,此解决方案将它们打印在不同的行上。不确定 OP 是否想要。
  • 也许,但在问题中,输出是如何显示的。
【解决方案2】:
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 的输出并产生所需的结果

【讨论】:

  • 您可能需要修剪引号。也可能"[^"]+" 更具包容性。
【解决方案3】:

如果你想在同一行打印所有双引号字符串,那么试试这个 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"

$

【讨论】:

    【解决方案4】:

    如果您不介意包含引号的输出,则简单的 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-04
      • 2021-05-11
      • 1970-01-01
      • 1970-01-01
      • 2021-03-12
      • 2015-10-29
      • 2020-06-22
      相关资源
      最近更新 更多