簡體   English   中英

sed不喜歡regex語法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM