sed不喜欢正则表达式语法

时间:2016-12-06 02:17:53

标签: regex bash sed

我正在尝试在文件上运行以下命令以获取版本号的前3个部分:

sed -nE 's/^([\d.]+)(?=\.)/\1/' version

该文件如下:

1.2.3.4

我希望1.2.3按照我在regexr上测试的正则表达式输出但是由于某种原因,regexr的语法与sed期望的内容之间存在不一致,并且我继续得到以下错误:

sed: -e expression #1, char 21: Invalid preceding regular expression

2 个答案:

答案 0 :(得分:2)

唯一保证提供的功能sedits POSIX specification中给出的功能。这又指the POSIX Basic Regular Expressions syntax,其中包含一组非常有限的保证扩展。相比之下,(?=...)\d都是PCRE个扩展,甚至在POSIX ERE中都没有。

sed支持BRE(默认情况下)或ERE(具有特定于平台的扩展程序,例如-r-E)。 \d不是其中任何一个的一部分;两者都不是(?=...)

等效的ERE将是:

sed -Ee 's/^([[:digit:].]+)[.][^.]*$/\1/' version

...或BRE等价物(使用基线POSIX sed):

sed -e 's/[.][[:digit:]]\{1,\}$//' version

...或者更好的是,根本不使用sed,而是坚持使用bash内置功能:

full_version=$(<version)   # or full_version=$(cat version) on non-bash shells
version=${full_version%.*} # trim everything after the last "."

答案 1 :(得分:0)

补充Charles Duffy's helpful answer

如果src="1.24.4/resources/sap-ui-core.js" 文件的唯一内容是版本号,如果您需要固定的组件数,则可以使用以下version命令:

bash

这仅从输入的(第一行)中提取前3个 IFS='.' read -r maj min rev _ < version ver=$maj.$min.$rev # with the sample input, $ver is now '1.2.3' - 分隔的标记(行的其余部分,如果有的话,被分配给未使用的变种。.),并且然后将它们重建为3组件版本号。

$_替代方案(对于单个版本号来说有点笨拙;不匹配的行按原样传递):

perl