【问题标题】:To extract strings between special characters using grep on mac在 mac 上使用 grep 提取特殊字符之间的字符串
【发布时间】:2017-09-02 01:05:01
【问题描述】:

我正在尝试检索 {{| 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 上执行此操作。谢谢!

【问题讨论】:

  • 如果你可以安装 GNU grep,很容易得到需要的结果
  • 如果对您有帮助,您能否就以下答案提供反馈?

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


【解决方案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

【讨论】:

  • 它工作正常。我将其扩展为在文件夹上运行并将其保存到文件find /Users/my_app/src -type f -name "*.html" -exec awk -F'[{}]' '{split($(NF-2),array,"|"); print array[1]}' &gt; alltranslatewords.txt
  • 做到了:-标记,喜欢您的评论 :) 并感谢您的帮助。你能帮我得到如上。
  • 我收到了这个awk: trying to access out of range field -1。这是什么意思?
  • 问题是有些行有其他格式。我修好了它。 for 在这里不是递归的!不过谢谢!
【解决方案2】:

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' 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-10
    • 2021-07-18
    • 2021-03-19
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    相关资源
    最近更新 更多