Как получить все цитируемые строки в файле? - PullRequest
0 голосов
/ 12 февраля 2019

Мне нужно извлечь все строки, заключенные в одинарные кавычки, в файл.Например, если файл содержит следующую строку:

"Julius" was not "Ceaser"

Он должен вывести

Julius 
Ceaser

Я хочу сделать это с помощью bash (Sed / Awk).Используя Awk, я могу извлечь одно вхождение, но как мне получить все строки?

Ответы [ 4 ]

0 голосов
/ 12 февраля 2019

Если вы не возражаете против вывода, включая кавычки, может сработать простое 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
0 голосов
/ 12 февраля 2019

awk на помощь!

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

Julius
Ceaser

используя это содержимое

$ cat file

Мне нужно извлечь все строки, заключенные в одинарные кавычки, в файл.Например, если файл содержит следующую строку: «Julius» не был «Ceaser». Он должен вывести Julius Ceaser

, если предполагается, что нет экранированных кавычек.

0 голосов
/ 12 февраля 2019

Если вы хотите напечатать все строки в двойных кавычках в одних и тех же строках, попробуйте этот Perl однострочный

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"

$
0 голосов
/ 12 февраля 2019
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 идает желаемый результат
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...