【发布时间】:2018-03-20 06:19:31
【问题描述】:
我想提取写入文件的内容。举个例子吧
{{{
How
R
U
}}}
{{{ Hi }}}
我想像这样打印输出
How
R
U
Hi
【问题讨论】:
标签: regex linux bash shell pattern-matching
我想提取写入文件的内容。举个例子吧
{{{
How
R
U
}}}
{{{ Hi }}}
我想像这样打印输出
How
R
U
Hi
【问题讨论】:
标签: regex linux bash shell pattern-matching
嗯,这不是regex 这是使用gawk 多字符RS。
awk -v RS='}}}|{{{' 'NF' inputfile
How
R
U
Hi
您可以在上面的命令中使用类似sed -r 's/^ +//g' 的pipe 来删除行首的多余空格。
【讨论】:
awk 将每一行视为记录,\n 视为记录分隔符(RS)。这里我们强制 awk 将记录分隔符视为{{{ 或}}}
piping 和不使用piping。 NF 表示字段数,它是 awk 的一种神秘方式,即只打印具有任何字段的行
/Hi/替换NF以打印Hi
通过使用正则表达式,这变得很棘手,主要是因为grep 或awk 似乎不支持lookahead。
要仅提取或匹配大括号内的文本,可以使用此正则表达式:https://regex101.com/r/ASFIFa/1
[^{\}]+(?=})
因此,您可以尝试ag - The Silver Searcher,这样会产生您所需的输出:
$ ag -o '[^{\}]+(?=})' input.txt
删除前导空格:
$ ag -o '[^{\}]+(?=})' input.txt | sed 's/^ *//'
【讨论】:
使用 sed
sed '/{{{/!d;:A;/\}\}\}/!{N;bA};s/{{{//;s/}}}//;s/ *//g' infile
或者
sed -E '/\{{3}/!d;:A;/\}{3}/!{N;bA};s/\{{3}| *|\}{3}//g' infile
【讨论】: