繁体   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