使用mac上的grep在特殊字符之间提取字符串

时间:2017-04-06 19:57:02

标签: regex bash html-parsing regex-lookarounds text-extraction

我正在尝试在{{| translate之间检索文字。

输入:testfile.txt

views/range.html:      <button type="button" class="btn" ng-click="setRange(7 * 24 * 3600 * 1000)">{{ '7 days' | translate }}</button>
views/widget.html:    <span class="state">{{phase}}/2</span> {{titles[phase-1] | translate}}
views/directives/widget.html:    <button class="btn" ng-disabled="selectedWidgets.length === 0" ng-click="phase = 2">{{ 'Next' | translate }}</button>

预期结果:

'7 days'
titles[phase-1]
'Next'

到目前为止尝试过:

grep "translate" | grep -o "'[^']*'" testfile.txt
#results
'7 days'
'Next'

grep '{\{\(.*\)|\translate%\1%' testfile.txt
#results
grep: invalid repetition count(s)

awk -F '{{|translate' '{print $2}' testfile.txt
#results
 '7 days' | 
phase}}/2</span> 
 'Next' |

我在macOS Sierra上执行此操作,版本10.12.4。谢谢!

2 个答案:

答案 0 :(得分:1)

您可以使用此awk进行此提取,

awk -F'[{}]' '{split($(NF-2),array,"|"); print array[1]}' file
 '7 days' 
titles[phase-1] 
 'Next' 

我们的想法是将字段分隔符设置为{},以便我们可以从文件中访问{}中的字段。所以$(NF-2)代表倒数第二个字段,它包含像

这样的行
 '7 days' | translate 
titles[phase-1] | translate
 'Next' | translate 

在上述行中,如果我们将split()函数与|去限制器一起使用,则第一个分割字段值将包含我们要查找的值。

OP希望将awk命令应用于文件夹中的所有html文件,可以将其作为

for file in /Users/my_app/src/*.html; do
    awk -F'[{}]' '{split($(NF-2),array,"|"); print array[1]}' "$file" >> alltranslatewords.txt
done

答案 1 :(得分:0)

BSD grep (在OSX上)不支持-P (--perl-regex)

使用以下 perl 方法:

perl -nle 'print $1 if m{> ?\{\{\s*([^|\}]+?)\s*\| translate}' testfile.txt

-n选项 - 使Perl假定你的程序有以下循环,这使得它迭代文件名参数,有点像sed -n或awk:

-l选项 - 启用自动行结束处理

-e选项 - 允许您在命令行上指定一行代码。

print $1 - 打印第一个捕获组,即([^|\}]+?)

输出:

'7 days' 
titles[phase-1] 
'Next'