3

我有一个包含如下文本的文件:

###interest1 moreinterest1### sometext ###interest2###
not-interesting-line
sometext ###interest3###
sometext ###interest4### sometext othertext ###interest5### sometext ###interest6###

我想提取###.

我想要的输出是这样的:

interest1 moreinterest1
interest2
interest3
interest4
interest5
interest6

我尝试了以下方法:

grep '###' file.txt | sed -e 's/.*###\(.*\)###.*/\1/g'

这几乎可以工作,但似乎只抓取每行的第一个实例,所以我的输出中的第一行只抓取

interest1 moreinterest1

而不是

interest1 moreinterest1
interest2
4

5 回答 5

2

使用 GNU awk 进行多字符 RS:

$ awk -v RS='###' '!(NR%2)' file
interest1 moreinterest1
interest2
interest3
interest4
interest5
interest6
于 2021-06-24T16:28:38.297 回答
2

这是实现此目的的单个awk命令,它使###字段分隔符并打印每个偶数字段:

awk -F '###' '{for (i=2; i<NF; i+=2) print $i}' file

interest1 moreinterest1
interest2
interest3
interest4
interest5
interest6

这是一个替代 grep + sed解决方案:

grep -oE '###[^#]*###' file | sed -E 's/^###|###$//g'

这假设标记之间没有#字符。###

于 2021-06-24T14:54:57.800 回答
1
sed 't x
s/###/\
/;D; :x
s//\
/;t y
D;:y
P;D' file

用换行符替换“###” D,然后有条件地分支到P如果“###”的第二次替换成功。

于 2021-06-24T16:05:23.590 回答
1

您可以使用pcregrep

pcregrep -o1 '###(.*?)###' file

正则表达式 -###(.*?)###匹配###,然后将除换行符之外的任何零个或多个字符捕获到第 1 组中,尽可能少,###然后匹配###

o1选项将仅输出组 1 值。

在线查看正则表达式演示

于 2021-06-24T15:13:49.470 回答
0

这可能对您有用(GNU sed):

sed -n 's/###/\n/g;/[^\n]*\n/{s///;P;D}' file

###用换行符替换所有出现的's。

如果一行包含换行符,请删除第一个换行符之前(包括第一个换行符)之前的所有字符,打印直到下一个换行符(包括以下换行符)的详细信息,删除这些详细信息并重复。

于 2021-06-25T12:59:39.003 回答