regex 我怎样才能得到两个特殊牧师之间的单词列表

wyyhbhjk  于 2023-05-19  发布在  其他
关注(0)|答案(4)|浏览(157)

输入

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

期望输出

123 hello john wick

我尽力了

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

它只给出最后一个值wick

xuo3flqw

xuo3flqw1#

您可以使用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
pxy2qtax

pxy2qtax2#

如果GNU awk也可以:

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

输出:

123 hello john wick
8qgya5xd

8qgya5xd3#

关于perl

perl -lne 'print join " ", /\{\{\h*\K.*?(?=\h*\}\})/g'
  • /\{\{\h*\K.*?(?=\h*\}\})/g以获取在{{}}之间找到的所有匹配项,匹配项周围有可选的水平空格
  • .*?是非贪婪的,.*是贪婪的,将从第一个{{匹配到最后一个}}
  • \K忽略此点之前的匹配文本
  • (?=...)是先行的,同样是为了避免将此部分作为匹配文本的一部分
  • 然后用间隔物作为分隔物将火柴连接起来

sed

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

这适用于给定的样本,但可能不适合其他情况。这是通过删除所需部分周围的文本来实现的,假设{}足够独特。

zqry0prt

zqry0prt4#

  • upside::完全绕过捕获组
  • downside::* 一些单词之间的额外空格,因为它由双对花括号划定,同时保留其中的所有空格 *
mawk NF=NF FS='(^|[}]+)[^{]*([{]+|$)'
123 hello  john   wick

为了快速提取成分,一般来说,尝试

gawk NF=NF FS=' *[{}]+ *' OFS='\14\10\10'
text
  123
   text
     hello
        text
          john
            text
              wick
                text

相关问题