我試圖用 image 替換除 URL 之外的所有 URL 的影像標記bar。但是,它說正則運算式無效。
只檢查(image:(?!.*bar).*:).*regex101.com 上的正則運算式看起來不錯。用 group 替換 sed 運算式的第二部分時出現錯誤(image:(?!.*bar).*:)。
$ echo '
image: mydomain/subdomain/foo:old_tag
image: mydomain/subdomain/bar:dont_update_me_tag
image: mydomain/subdomain/baz:old_tag
' | sed --regexp-extended "s|(image:(?!.*bar).*:).*|\1new_tag|g"
sed: -e expression #1, char 36: Invalid preceding regular expression
預期的最終結果是:
image: mydomain/subdomain/foo:new_tag
image: mydomain/subdomain/bar:dont_update_me_tag
image: mydomain/subdomain/baz:new_tag
正則運算式的解釋(image:(?!.*bar).*:).*
搜索所有包含的行,image:.*:.*除了那些包含image:.*bar
uj5u.com熱心網友回復:
POSIX ERE 仍然不支持環視。幸運的是,您可以將一行與特定模式匹配并跳過它,然后匹配您需要的任何內容:
sed -E "/image:.*bar/!s/(image:.*:).*/\1new_tag/"
請參閱在線演示:
echo '
image: mydomain/subdomain/foo:old_tag
image: mydomain/subdomain/bar:dont_update_me_tag
image: mydomain/subdomain/baz:old_tag
' | sed -E "/image:.*bar/!s/(image:.*:).*/\1new_tag/"
輸出:
image: mydomain/subdomain/foo:new_tag
image: mydomain/subdomain/bar:dont_update_me_tag
image: mydomain/subdomain/baz:new_tag
uj5u.com熱心網友回復:
這可能對你有用(GNU sed):
sed -E 's/^/\n/
:a;ta
s/\n(image: \S*bar\S*)/\1\n/;ta
s/\n(image: \S*:)\S*/\1new_tag\n/;ta
s/\n(.)/\1\n/;ta
s/\n$//' file
一次處理一行。
在行首引入換行符。
如果換行符后面的字串是其中的影像,bar則跳過它,移動換行符并重復。
如果換行符后面的字串是一個沒有包含bar在其中的影像,請將其替換為新標簽,移動換行符并重復。
否則,將換行符移過下一個字符并重復。
當換行符無法再移動時,將其洗掉,列印當前行并重復。
NBg不能使用替換命令的標志,因為必須單獨比較影像的每個實體。如果每行只有一個影像而沒有其他影像,則使用 @Wiktor Stribi?ew 解決方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/372615.html
