sed - 有没有更好的方法来使用 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;/"
有一个更好的方法吗?我可以在哪里复制和附加而不会乱七八糟?
解决方案
您可以匹配除/
after之外的任何字符,SUM License:
并将它们捕获到第 1 组,同时匹配该行的其余部分,然后&;\1
在替换模式中使用在匹配发生的行末尾的分号后附加捕获的名称:
sed 's/^SUM License: *\([^\]*\).*/&;\1/'
请参阅在线sed
演示。
POSIX BRE 模式细节
^
- 一行的开始SUM License:
- 文字字符串*
- 0 个或多个空格\([^\]*\)
- 捕获组 1:除\
.*
- 线路的其余部分。
RHS 详细信息
&
- 整个匹配值;
- 一个分号\1
- 第 1 组值占位符。
推荐阅读
- wpf - 并非所有 StackPanel 的 DataTriggers 都在工作
- html - 如何在 HTML 电子邮件中创建反馈表?
- laravel - 包中的扩展用户模型
- java - 加载了哪个配置文件?
- javascript - Angularjs typeahead显示对象数组
- xsl-fo - 左侧为原文,右侧为正对译文
- xamarin.ios - 为 android 类库 vs 2017 生成 nugetpackage
- javascript - 使用 CSV 或 JS 文件填充 HTML 表格中的特定 TD
- json - Angular - 我如何在整个 JSON 中替换整个字符?
- flutter - 我的 Flutter FutureBuilder 如何在布局中的多个位置更改文本?