【发布时间】:2017-01-19 07:57:37
【问题描述】:
问题
在一个 linux 脚本中,我想用文件中的数据分配几个变量。
该命令应该能够:
- 使用复杂的正则表达式:表示普通的 java/javascript/php/perl 正则表达式, 我可以适应一些变化
- 在标准输出返回第一个捕获组(或参数指定的捕获组)。如果它支持命名捕获组可以接收名称作为参数:`regextractor ""
- 理想情况下应该已经存在于标准 linux 发行版中,也许在 osx 上也是如此
示例
我正在寻找类似的命令
mydate=`regextractor "^date:\s*(\S{10}).*$" myfile.md`
mytitle=`regextractor "^title:\s*(.*)\s*$" myfile.md`
echo $mydate - $mytitle
我的文件:
---
slug: article1
date: 2012-01-29 15:34:01
title: What is the best monetary system invented til now?
author: raisercostin<raisercostin@gmail.com>
tags: currency,monetary,system
type: question
toslug: article
这里测试了正则表达式:https://regex101.com/r/y311eP/1
我试过了
- 更新:grep - 默认 grep 使用简化的正则表达式
grep -o "toslug:\(.*\)" myfile.md=>toslug: article - 更新:grep 扩展 - 它支持复杂的正则表达式但不捕获组
grep --color=no -oE "toslug:(.*)" myfile.md=>toslug: article - sed - 它不支持捕获组,因此返回一行。
sed -nE "s/^date:\s*(\S*)//p" myfile.md更新:它实际上支持捕获组,但您需要使用 -E 参数启用 --regexp-extended - awk - 它不支持捕获组,因此返回一行
awk '/^date:\s*(.*)$/' myfile.md
更新
- 在我的
Linux vagrant-ubuntu-trusty-64 3.13.0-101-generic #148-Ubuntu SMP Thu Oct 20 22:08:32 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux上:- sed 没有记录 -E 选项,但适用于某些情况
-
工作
sed -nE 's/^date:\s*(\S*)/\1/p' myfile.md=>2012-01-29 15:34:01 -
不起作用
sed -nE 's/^date:\s*(\S{10})/\1/p' myfile.md=>2012-01-29 15:34:01 -
不起作用
sed -nE 's/^date:\s*(\S*)$/\1/p' myfile.md=> 没有行 -
工作
awk '{ match($0, /^date:\s*(\S{10}).*$/, a); if(a[1])print a[1]}' myfile.md=>2012-01-29
- 在我的
Darwin costins-MBP.router1 16.3.0 Darwin Kernel Version 16.3.0: Thu Nov 17 20:23:58 PST 2016; root:xnu-3789.31.2~1/RELEASE_X86_64 x86_64上:-
部分工作
sed -nE 's/^date:\s*(\S*)/\1/p' myfile.md=>2012-01-29 15:34:01- 初始空间未被占用 -
不起作用
sed -nE 's/^date:\s*(\S{10})/\1/p' myfile.md=> 没有行 -
不起作用
sed -nE 's/^date:\s*(\S*)$/\1/p' myfile.md=> 没有行 -
不起作用
awk '{ match($0, /^date:\s*(\S{10}).*$/, a); if(a[1])print a[1]}' myfile.md=>awk: syntax error at source line 1{ match($0, >>> /^date:\s*(\S{10}).*$/, <<<
-
部分工作
【问题讨论】:
-
sed支持捕获组。在替换中使用\1来获取该组的匹配项。 -
你对 \1 的存在是正确的,它只有在 -E 传递了一个未在我的 ubuntu 发行版中记录的参数时才有效。无论如何,似乎还有其他限制:行的开始/结束和匹配的字符数。
-
我从来不需要使用
-E。 -
sed使用 BRE,所以需要在(之前使用反斜杠来制作捕获组。 -
如果我删除 -E 我会得到以下
sed -n 's/^date:\s*(\S*)$/\1/p' myfile.md sed: -e expression #1, char 22: invalid reference \1 ons' 命令的 RHS` 。这就是为什么我一开始说它不支持捕获组。
标签: regex