[英]How can i except specific lines with sed?
我有這個命令來運行 git 日志並刷新文件列表:
sed -E 's|(.*): .*|echo \1: $(git log -1 --pretty="format:%ct" \1)|e' app/config/file.yml
我的問題是此命令刷新 file.yml 中的每一行,但我有一個不想刷新的前綴。 前綴是 web/compile/*
我嘗試這樣做,但不幸的是刪除了沒有 /web/compile 前綴的所有內容。
sed -i.bkp '/web\/compiled\/*/!e' -E 's|(.*): .*|echo \1: $(git log -1 --pretty="format:%ct" \1)|e' app/config/file.yml
首先要知道,用sed修改一個yaml的文件是有風險的。 (我看到你把領先的東西保留到最后:
避免干擾縮進,但這不安全)
使用 sed,您可以通過/pattern/{action}
匹配模式,在這里您只需用“前綴”路徑填充pattern
部分。 但是,仔細檢查你的“前綴”,如果有前導空格(縮進),你可能想要\s*/web/com....
類似於您s|pat|rep_or_cmd|e
,您可以使用另一個分隔符進行模式匹配,如果您的模式包含斜線,我們在最后一項中討論過。 所以\@^\s*/web/compile@
會更容易閱讀
來解決。 你有兩種不同的方式來做你想做的事:
sed '\@^\s*/web/compile@n; s|your s cmd....|' file
要么
sed '\@^\s*/web/compile@!s|your s cmd....|' file
在你的問題中,你寫的前綴有時是web/compile
有時是/web/compile
,你應該在 sed 命令中寫正確的並測試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.