如何使用 sed 提取文件的文本片段?

如何使用 sed 提取文件的文本片段?

我正在尝试创建一个 BASH 脚本来从一个文件中提取文本片段,该文件包含许多与此类似的行:

"11","category/subcategory/sub-subcategory/item-1","index.php?option=com_trombinoscopeextended&Itemid=125&lang=es&view=trombinoscope","251","0","0000-00-00","","","","","","","0"

从每一行我只需要保留:

category/subcategory/sub-subcategory/item-1

可以删除上下文。我正在尝试使用 sed 但我找不到办法做到这一点。我不明白如何使用我已有的正则表达式创建命令:

\w+(\/[\w-]+)+

我一直在阅读并已经尝试过这个命令和其他类似的命令,但我对此不太了解:

cat file.txt | sed -i -E "s/\w+(\/[\w-]+)+"

这绝对行不通,而且我找不到关于如何使用 sed 和正则表达式的初学者指南。

答案1

解析这样的文件最好用awk

awk -F, '{ print $2 }' file

或者cut

cut -d, -f 2 file

这将为您提供"category/subcategory/sub-subcategory/item-1"您提供的数据(包括报价)。

使用sed, 并利用您提供的正则表达式(但\w替换为[[:alnum:]]):

sed -E 's@.*,"([[:alnum:]]+(/[[:alnum:]-]+)+)",.*@\1@' file

这会将整行替换为与第一组括号内的正则表达式匹配的位。这将返回category/subcategory/sub-subcategory/item-1您提供的数据。

对于更一般的 CSV 文件解析,包括正确处理可能包含逗号或双引号的引用和字段,请使用csvkit:

csvcut -c 2 file

答案2

你的正则表达式本身没有任何问题,只是你不小心就掉进了陷阱。在 [] 内部, \w 是两个文字,一个反斜杠和一个“w”,而不是人们可能认为的“\w”,或者像 Perl 中那样,它是从那里借来的,但不是完全借用的。

一种方法是明确列出 \w 中的内容,然后继续:

sed -Ee '
    /\n/{P;D;}
    s|\w+(/[-_A-Za-z0-9]+)+|\n&\n|;D
'

相关内容