在mac上使用grep提取特殊字符之间的字符串
问题描述:
我试图检索{{
和| translate
之间的文本。在mac上使用grep提取特殊字符之间的字符串
输入: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塞拉利昂,版本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的(在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'
如果你可以安装GNU的grep,它会很容易地得到所需要的结果 – RomanPerekhrest
您能在答案提供反馈下面如果它帮助你? – Inian