我想先从第一列括号中取出字符串,我可以这样做:
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