有没有更好的方法可以使用sed获取部分行(不一致)并将其附加到末尾?

有没有更好的方法可以使用sed获取部分行(不一致)并将其附加到末尾?,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://

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

这是一个包含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;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;/"
有更好的方法吗? 我可以在哪里复制和附加而不必太麻烦?

看看这行

SUM License: Abra Nabra License - v 3.0 \- http://www.xx.x/l.html
它是否总是以
SUM License:
开头?它是否总是以
\-http://
结束许可证

如果是这样,您可以将其作为sed规则,首先发出原始行内容

s/^(SUM License: )(.*)( \- http:)(.*)$/\1\2\3\4;\2/
您的sed是否支持\0?然后它变成:

s/^(SUM License: )(.*)( \- http:)(.*)$/\0;\2/
你也可以去掉多余的括号


请注意,这些是可读的扩展regexp,随选项
-r
引入。如果您想使用传统的regexp,您必须将所有括号反斜杠。

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

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

POSIX BRE图案细节

  • ^
    -行的开头
  • SUM许可证:
    -文本字符串
  • *
    -0或更多空格
  • \([^\]*\)
    -捕获组1:除
    \
  • *
    -行的其余部分
RHS详细信息

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

sed的/^SUM许可证:\([^\]*\)./&\1/'
?见@WiktorStribiżew谢谢!这管用!你能把它写成一个答案,这样我就可以标记它吗?
awk'{printf”%s%s\n',$0,$1~/SUM License/?$2:“}”FS='[:\\\\]'
sed 's/^SUM License: *\([^\]*\).*/&;\1/'