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