首页 > 解决方案 > 有没有更好的方法来使用 sed 抓取部分行(不一致)并将其附加到末尾?

问题描述

我想抓取一个字符串并将其附加到行尾。问题是,模式不一致。我还想保持整行完整,只需复制其中的一部分并将其附加到以分号分隔的末尾。我搜索了类似的问题,但它们并没有完全回答我想要做的事情。

这是包含 1000 行(输入)的示例文件:

Group: ch.qos.lback Name: lback.sa Version: 0.1.11 
Manifest Project URL: http://www.xx.x
Manifest license URL: http://www.xx.x/l.html
SUM License: Abra Nabra License - v 3.0 \- http://www.xx.x/l.html
SUM License: GNU Lesser General Public License \- http://www.gnu.org/licenses/lhtml

Group: com.aol.sim Name: cycact Version: 3.0.0-RT 
SUM Project URL: https://xx.com/xx
SUM License: The Apache Software License, Version 2.0 \- http://www.apache.org/licenses/LICENSE-2.0.txt

Group: com.fa Name: ce Version: 1.3.4 
SUM License: The Apache Software License, Version 2.0 \- http://www.apache.org/licenses/LICENSE-2.0.txt
Embedded license: cle-1.3.4.jar/META-INF/LICENSE cle-1.3.4.jar/META-INF/NOTICE

我想要的是期望的输出:

Group: ch.qos.lback Name: lback.sa Version: 0.1.11 
Manifest Project URL: http://www.xx.x
Manifest license URL: http://www.xx.x/l.html
SUM License: Abra Nabra License - v 3.0 \- http://www.xx.x/l.html;Abra Nabra License - v 3.0
SUM License: GNU Lesser General Public License \- http://www.gnu.org/licenses/lhtml;GNU Lesser General Public License

Group: com.aol.sim Name: cycact Version: 3.0.0-RT 
SUM Project URL: https://xx.com/xx
SUM License: The MIT License, Version 2.0 \- http://www.x.x.txt;The MIT License, Version 2.0

Group: com.fa Name: ce Version: 1.3.4 
SUM License: The Apache Software License, Version 2.0 \- http://www.apache.org/licenses/LICENSE-2.0.txt;The Apache Software License, Version 2.0
Embedded license: cle-1.3.4.jar/META-INF/LICENSE cle-1.3.4.jar/META-INF/NOTICE

所以基本上提取许可证的名称并将其附加到末尾。

e.g. ;Abra Nabra License - v 3.0

我可以执行以下操作来抓取字符串并将其存储在变量中:

var=$(echo "SUM License: Apache License, Version 2.0 \- http://www.apache.org/licenses/LICENSE-2.0" | gsed -n 's/.*\SUM License: \(.*\)\http.*/\1/p')

然后将其添加到文件的末尾,使用 while 循环执行另一个 sed:

gsed "/^SUM License:/ s/$/;$var;/"

有一个更好的方法吗?我可以在哪里复制和附加而不会乱七八糟?

标签: sed

解决方案


您可以匹配除/after之外的任何字符,SUM License:并将它们捕获到第 1 组,同时匹配该行的其余部分,然后&;\1 在替换模式中使用在匹配发生的行末尾的分号后附加捕获的名称:

sed 's/^SUM License: *\([^\]*\).*/&;\1/'

请参阅在线sed演示

POSIX BRE 模式细节

  • ^- 一行的开始
  • SUM License:- 文字字符串
  • *- 0 个或多个空格
  • \([^\]*\)- 捕获组 1:除\
  • .*- 线路的其余部分。

RHS 详细信息

  • &- 整个匹配值
  • ;- 一个分号
  • \1- 第 1 组值占位符。

推荐阅读