使用正则表达式/ sed修剪文件

时间:2013-05-08 19:02:37

标签: regex sed

我有一个包含这样几行的文件:

*wordX*-Sentence1.;Sentence2.;Sentence3.;Sentence4.

其中一个句子可能包含也可能不包含wordX。 我想要的是修剪文件使它看起来像这样:

*wordX*-Sentence1.;Sentence2.

Sentence3是第一个包含wordX的人。

我如何用sed / awk做到这一点?

编辑:

这是一个示例文件:

*WordA*-This sentence does not contain what i want.%Neither does this one.;Not here either.;Not here.;Here is WordA.;But not here.
*WordB*-WordA here.;WordB here, time to delete everything.;Including this sentece.
*WordC*-WordA, WordB. %Sample sentence one.;Sample Sentence 2.;Sample sentence 3.;Sample sentence 4.;WordC.;Discard this.

这是所需的输出:

*WordA*-This sentence does not contain what i want.%Neither does this one.;Not here either.;Not here.
*WordB*-WordA here.
*WordC*-WordA, WordB. %Sample sentence one.;Sample Sentence 2.;Sample sentence 3.;Sample sentence 4.

3 个答案:

答案 0 :(得分:1)

这个任务更适合awk。使用以下awk命令:

awk -F ";" '/^ *\*.*?\*/ {printf("%s;%s\n", $1, $2)}' inFile

这假定您尝试匹配的字词始终用星号*包裹。

答案 1 :(得分:0)

这可能适合你(GNU sed):

sed -r 's/-/;/;:a;s/^(\*([^*]+)\*.*);[^;]+\2.*/\1;/;ta;s/;/-/;s/;$//' file

-后的wordX转换为;。删除包含wordX的句子(从后面到行的前面工作)。替换原始-。删除最后一个;

答案 2 :(得分:0)

sed -r -e 's/\.;/\n/g' \
       -e 's/-/\n/' \
       -e 's/^(\*([^*]*).*\n)[^\n]*\2.*/\1/' \
       -e 's/\n/-/' \
       -e 's/\n/.;/g' \
       -e 's/;$//'

(编辑:添加-\n互换以处理第一句中的匹配。)