簡體   English   中英

我如何排除 sed 的特定線路?

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

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