我正在尝试在文件上运行以下命令以获取版本号的前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
答案 0 :(得分:2)
唯一保证提供的功能sed
是its 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