有没有更好的方法可以使用sed获取部分行(不一致)并将其附加到末尾?
我想抓取一个字符串并将其附加到行的末尾。问题是,这种模式并不一致。我还想保持整行的完整性,只需复制其中的一部分并将其附加到以分号分隔的末尾。 我搜索过类似的问题,但它们并不完全回答我想做的事情 这是一个包含1000行(输入)的示例文件: 我想要的是期望的输出:有没有更好的方法可以使用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://
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:除\([^\]*\)
\
-行的其余部分*
-整个匹配值&
代码>-分号
-组1值占位符\1
sed的/^SUM许可证:\([^\]*\)./&\1/'
?见@WiktorStribiżew谢谢!这管用!你能把它写成一个答案,这样我就可以标记它吗?awk'{printf”%s%s\n',$0,$1~/SUM License/?$2:“}”FS='[:\\\\]'
sed 's/^SUM License: *\([^\]*\).*/&;\1/'