如何在两个非字符模式之间提取单词?

时间:2014-04-19 20:09:18

标签: bash shell

我想知道如何提取这两种模式之间的所有单词:****__****。下划线表示空格。

到目前为止,我已经完成了:

awk '/^**** / {flag=1;next} / ****$/{flag=0} flag {print}'

文件的一部分

.
.
.
**** Hoja de vida ****
Nombre                
Nombre en citaciones 
Nacionalidad         
**** Formación Académica ****
.
.
.

3 个答案:

答案 0 :(得分:3)

以下应该做。请注意,*需要转义。请注意,此解决方案包含开始和结束模式

awk '/^\*\*\*\* /,/ \*\*\*\*$/'  file

如果您需要排除开始和结束模式

awk '/^\*\*\*\* /,/ \*\*\*\*$/{if ($0 !~ /^\*\*\*\* | \*\*\*\*$/)print}' file

稍微简洁一点
sed -n '/^\*\*\*\* /,/ \*\*\*\*$/{/^\*\*\*\* \| \*\*\*\*$/!p}' file

答案 1 :(得分:2)

您的答案有两个主要问题。首先不是逃避元字符*。第二个 最初没有显示您的示例输入文件。 :)

由于你想在模式之间抓取单词,你可以这样做:

awk 'gsub(/\*\*\*\*/,"")==2 && $1=$1' file

gsub函数返回所做的替换次数。由于我们对****之间的行感兴趣,因此我们检查了2. $1=$1是为了确保输出中没有前导和尾随空格。

答案 2 :(得分:0)

您可以尝试使用可选的空格分隔4 *:

echo '**** Hoja de vida ****' | awk -F' *\\*\\*\\*\\* *' '{print $2}'
Hoja de vida