根据两列的结果连接url



我想先从第一列括号中取出字符串,我可以这样做:

awk -F"[()]" '{print $2}'

然后,将它与第二列连接起来,创建一个格式如下的URL:

"https://ftp.drupal.org/files/projects/"[firstcolumn stripped out of parenthesis]-[secondcolumn].tar.gz

输入如下:

Admin Toolbar (admin_toolbar)           8.x-2.5       
Entity Embed (entity_embed)             8.x-1.2       
Views Reference Field (viewsreference)  8.x-2.0-beta2 
Webform (webform)                       8.x-5.28 

第一行的数据将创建这个URL:

https://ftp.drupal.org/files/projects/admin_toolbar-8.x-2.5.tar.gz

类似

sed 's!^[^(]*(([^)]*))[[:space:]]*(.*)!https://ftp.drupal.org/files/projects/1-2.tar.gz!' input.txt

如果文件a有您的输入,您可以尝试:

$ awk -F'[()]' '
{ 
split($3,parts," *") 
printf "https://ftp.drupal.org/files/projects/%s-%s.tar.gzn", $2, parts[2]
}' a 
https://ftp.drupal.org/files/projects/admin_toolbar-8.x-2.5.tar.gz
https://ftp.drupal.org/files/projects/entity_embed-8.x-1.2.tar.gz
https://ftp.drupal.org/files/projects/viewsreference-8.x-2.0-beta2.tar.gz
https://ftp.drupal.org/files/projects/webform-8.x-5.28.tar.gz

技巧是拆分第三个字段($3)。根据字段分隔符(-F'[()]'),第三个字段包含右父括号之后的所有内容。所以,split可以用来去掉所有的空格。我可能应该找一个"整洁"的房间。等价的。

在示例数据中,最后第二列似乎包含您感兴趣的带括号的部分,以及最后一列的值。

如果总是这样,则可以从最后第二列中删除括号,并将连字符与最后一列连接起来。

awk '{
gsub(/[()]/, "", $(NF-1))
printf "https://ftp.drupal.org/files/projects/%s-%s.tar.gz%s", $(NF-1), $NF, ORS
}' file

输出
https://ftp.drupal.org/files/projects/admin_toolbar-8.x-2.5.tar.gz
https://ftp.drupal.org/files/projects/entity_embed-8.x-1.2.tar.gz
https://ftp.drupal.org/files/projects/viewsreference-8.x-2.0-beta2.tar.gz
https://ftp.drupal.org/files/projects/webform-8.x-5.28.tar.gz

使用正则表达式和gnu awk的另一个选项,使用匹配和2捕获组来捕获括号和下一个字段之间的内容。

awk 'match($0, /^[^()]*(([^()]+))s+(S+)/, ary) {
printf "https://ftp.drupal.org/files/projects/%s-%s.tar.gz%s", ary[1], ary[2], ORS
}' file

这可能适合您(GNU sed):

sed 's#.*(#https://ftp.drupal.org/files/projects/#;s/)s*/-/;s/s*$/.tar.gz/' file

模式匹配,用需要的字符串替换不需要的部分。

注意:使用#作为替换命令的分隔符,以避免在文字替换中插入反斜杠。

上述解决方案可以改进为:

sed -E 's#.*((.*))s*(S*).*#https://ftp.drupal.org/files/projects/1-2.tar.gz#' file

最新更新