在 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'
我正在尝试检索 {{
和 | 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'