输入
text {{123}}text{{hello}} text {{ john }} text{{ wick }}text
期望输出
123 hello john wick
我尽力了
sed 's/.*{{\(.*\)}}.*/\1/' <<< "$s"
它只给出最后一个值wick
wick
xuo3flqw1#
您可以使用gnu awk:
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"
pxy2qtax2#
如果GNU awk也可以:
awk '{$1=$1; gsub("({{ *| *}})","",$0)}1' FPAT='{{ *[^}]* *}}' file
输出:
8qgya5xd3#
关于perl
perl
perl -lne 'print join " ", /\{\{\h*\K.*?(?=\h*\}\})/g'
/\{\{\h*\K.*?(?=\h*\}\})/g
{{
}}
.*?
.*
\K
(?=...)
带sed
sed
sed 's/[^{]*{{ *\([^} ]*\) *}}[^{]*/\1 /g; s/ *$//'
这适用于给定的样本,但可能不适合其他情况。这是通过删除所需部分周围的文本来实现的,假设{和}足够独特。
{
}
zqry0prt4#
upside
downside
mawk NF=NF FS='(^|[}]+)[^{]*([{]+|$)'
为了快速提取成分,一般来说,尝试
gawk NF=NF FS=' *[{}]+ *' OFS='\14\10\10'
text 123 text hello text john text wick text
4条答案
按热度按时间xuo3flqw1#
您可以使用
gnu awk
:pxy2qtax2#
如果GNU awk也可以:
输出:
8qgya5xd3#
关于
perl
/\{\{\h*\K.*?(?=\h*\}\})/g
以获取在{{
和}}
之间找到的所有匹配项,匹配项周围有可选的水平空格.*?
是非贪婪的,.*
是贪婪的,将从第一个{{
匹配到最后一个}}
\K
忽略此点之前的匹配文本(?=...)
是先行的,同样是为了避免将此部分作为匹配文本的一部分带
sed
这适用于给定的样本,但可能不适合其他情况。这是通过删除所需部分周围的文本来实现的,假设
{
和}
足够独特。zqry0prt4#
upside
::完全绕过捕获组downside
::* 一些单词之间的额外空格,因为它由双对花括号划定,同时保留其中的所有空格 *为了快速提取成分,一般来说,尝试