[英]sed not liking regex syntax
我試圖在文件上運行以下命令以獲取版本號的前3個部分:
sed -nE 's/^([\d.]+)(?=\.)/\1/' version
該文件如下:
1.2.3.4
我期望按照我在regexr上測試過的regex輸出1.2.3
,但是由於某種原因,regexr的語法和sed期望的內容之間存在不一致,因此我繼續遇到以下錯誤:
sed: -e expression #1, char 21: Invalid preceding regular expression
sed
保證提供的唯一功能是其POSIX規范中提供的功能。 這反過來是指POSIX基本正則表達式語法 ,其中包含一組非常有限的保證擴展。 相反, (?=...)
和\\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 "."
為了補充Charles Duffy的有用答案 :
如果version
文件的唯一內容是版本號,那么如果您想要固定數量的組件,則可以使用以下bash
命令作為替代:
IFS='.' read -r maj min rev _ < version
ver=$maj.$min.$rev # with the sample input, $ver is now '1.2.3'
這僅提取前3個.
從輸入的(第一行)中分離的標記(該行的其余部分,如果有的話,分配給未使用的變量$_
),然后將其重建為3組件版本號。
一個perl
替代方法(對於單個版本號來說有點笨拙;不匹配的行按原樣傳遞):
perl -pe 's/^((\d+\.){3}).*/$1/; s/\.$//' version
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.