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

To extract strings between special characters using grep on mac

我正在尝试检索 {{| 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%%' testfile.txt
#results
grep: invalid repetition count(s)

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

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

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

BSD grep(on OSX) 不支持 -P (--perl-regex).

使用以下perl方法:

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

-n 选项 - 使 Perl 假设您的程序有以下循环,这使得它遍历文件名参数,有点像 sed -n 或 awk:

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

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

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

输出:

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