簡體   English   中英

使用sed從一行中刪除“*”?

[英]Remove a “*” from a line using sed?

我想獲得每一行的第一個字段,但它發生其中一個將是'*',我希望它被跳過。

git branch -vv

回報

  master 34a8e20 [origin/master: behind 14] renamed yml's
* ss_doc 3ebc755 [origin/ss_doc: gone] PRD configuration
  ss_fix d0f4a4c [origin/ss_fix: gone] Merge branch 'ss_fix' into 'master'
  ss_v   c3b4635 [origin/ss_v: gone] remove composes

當我應用以下sed命令時,結果如下

git branch -vv |  sed -r  's|\*?(\w+).+|\1|'

結果是

  master
* ss_doc
  ss_fix
  ss_v

我無法理解為什么它會在匹配組中捕獲“*”。 我嘗試了其他解決方法,但這是最接近目標的。 怎么不趕上“*”?

請注意, sed replacement命令僅替換匹配的內容。 什么不匹配不會被替換。

您的模式嘗試匹配* ,但如果它在當前位置找不到* ,它會嘗試匹配(\\w+).+ pattern(因為\\*?匹配一個或零個星號)。 由於它不匹配, sed replacement命令在結果中保持不匹配的*

您需要確保星號匹配。 由於*和單詞字符之間有空格,您可以將它與\\s*[[:space:]]*匹配:

sed -r 's|\*?\s*(\w+).+|\1|'

另一種方法是在單詞chars之前匹配任何空格和*

sed -r 's|[*[:space:]]*([[:alnum:]_]+).*|\1|'
          ^^^^^^^^^^^^^

或者,使用帶有grep的PCRE模式僅匹配您需要的模式:

grep -oP '^\W*\K\w+'

或者,刪除任何非單詞字符開始和awk出的第一個字段:

sed 's/^[^[:alnum:]_]*//' | awk '{print $1}'

請參閱在線演示

只需告訴awk在前導空白和星號后打印第一個字段:

$ awk -F'[ *]+' '{print $2}' file
master
ss_doc
ss_fix
ss_v

這將適用於任何UNIX系統上任何shell中的任何awk。 如果您更喜歡sed,這適用於任何sed:

$ sed 's/^[ *]*\([^ ]*\).*/\1/' file
master
ss_doc
ss_fix
ss_v

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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