如何在Bash中提取具有特定字符长度的多个字段?

时间:2018-12-23 12:36:29

标签: bash

我有一个包含几个字段的文件(test.csv),我想要的是标题和带有10个字符的路径,并从路径中删除了几个级别。完成的工作是使用awk命令选择两个字段:

$ awk -F "," '{print substr($4, 1, 10)","$6}' test.csv [1]

路径中需要删除的三个级别并不总是相同的。它可以是/article/17/1/或此/open-organization/17/1,所以我不能对字段$ 6使用substr。

这是我得到的结果:

Title,Path
Be the ope,/article/17/1/be-open-source-supply-chain
Developing,/open-organization/17/1/developing-open-leaders

想要的结果是:

Title,Path
Be the ope,be-open-source-supply-chain
Developing,developing-open-leaders

标题可以包含10个字符,但是我仍然需要从路径上删除3个级别。

我可以使用cut命令:

cut -d'/' -f5- to remove the "/.../17/1/"

但不确定如何将其传送到[1]

我尝试使用for循环逐个获取标题和路径,但是我很难让awk命令一次运行一行。

我花了数小时没有运气。任何帮助,将不胜感激。

用于测试的虚拟数据:

test.csv

发布日期,内容类型,作者,标题,评论数,路径,标签,字数

2017年1月31日,文章,斯科特·内斯比特(Scott Nesbitt),书评:《我们要黑客并拥有》,0,/ article / 17/1 / review-book-ours-to-hack-and-own,书籍,660 2017年1月31日,Article,Jason Baker,使用OpenStack的5条新指南,2,/ article / 17/1 / openstack-tutorials,“ OpenStack,操作方法和教程”,419

1 个答案:

答案 0 :(得分:2)

您可以使用正则表达式替换字符串。

stringZ="Be the ope,/article/17/1/be-open-source-supply-chain"

sed -E "s/((\\/\\w+){3}\\/)//" <<< $stringZ

请注意,如果要将文件作为sed的输入,则需要使用-i