Как я могу получить список слов между двумя специальными символами - PullRequest
1 голос
/ 16 апреля 2020

Вход

text {{123}}text{{hello}} text {{ john }} text{{ wick }}text

Требуемый вывод

123 hello john wick

Я пытался

sed 's/.*{{\(.*\)}}.*/\1/' <<< "$s" 

, который дает мне только последнее значение wick

Ответы [ 3 ]

1 голос
/ 16 апреля 2020

Если GNU awk также возможен:

awk '{$1=$1; gsub("({{ *| *}})","",$0)}1' FPAT='{{ *[^}]* *}}' file

Вывод:

123 hello john wick
1 голос
/ 16 апреля 2020

Вы можете использовать это gnu awk:

s='text {{123}}text{{hello}} text {{ john }} text{{ wick }}text'
awk -v FPAT='{{[^}]*}}' '{
   for (i=1; i<=NF; i++) {
      gsub(/^{{[ \t]*|[ \t]*}}$/, "", $i)
      printf "%s", $i (i < NF ? OFS : ORS)
   }
}' <<< "$s"

123 hello john wick
0 голосов
/ 16 апреля 2020

С perl

perl -lne 'print join " ", /\{\{\h*\K.*?(?=\h*\}\})/g'
  • /\{\{\h*\K.*?(?=\h*\}\})/g, чтобы получить все совпадения, найденные между {{ и }} с необязательными горизонтальными пробелами вокруг совпадения
    • .*? не жадный, .* жадный и будет совпадать с первого {{ до последнего }}
    • \K, чтобы игнорировать соответствующий текст до этой точки
    • (?=...) впереди, опять же, чтобы избежать этой части как части совпадающего текста
  • совпадения затем соединяются с пробелом в качестве разделителя


С sed

sed 's/[^{]*{{ *\([^} ]*\) *}}[^{]*/\1 /g; s/ *$//'

Это работает для данного образца, но может не подходить для других случаев. Это работает, удаляя текст вокруг необходимых частей, предполагая, что { и } достаточно уникальны.

...