我有一个包含这样几行的文件:
*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.
答案 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
互换以处理第一句中的匹配。)