在unix中删除两个单词之间的字符串

时间:2014-11-05 22:17:06

标签: shell unix awk sed

尝试删除txt文件中两个字符串(/**/)之间的文本,而不删除整行。

假设我有一个包含以下内容的文件:

/* reports */
%report1(email=first@email.com /*second@email.com */,lag=3);
%report2(email=first@email.com /*second@email.com
third@email.com */ ,lag=3);

我想要的输出是

%report1(email=first@email.com, lag=3);
%report2(email=first@email.com
,lag=3);

我尝试了trsedawk的多种组合,但仍无效。 有什么想法吗?请注意,报告2位于两个不同的行,分隔符/**/也位于不同的行上。

3 个答案:

答案 0 :(得分:1)

使用

perl -0777pe 's@/\*.*?\*/@@gs' file.txt

答案 1 :(得分:0)

awk 'BEGIN { RS="/"; ORS="" }\
     /^\*/,/\*$/ { f=1; next }\
     { if (f!=0) f=0; else print "/"; print }' file.txt

<强>解释

BEGIN { RS="/"; ORS="" }将记录分隔符设置为"/",输出记录分隔符设置为空字符串。

/^\*/,/\*$/ { f=1; next }跳过以*开头的文件和以*结尾的文件之间的任何记录,同时将标记f设置为1。

{ if (f!=0) f=0; else print "/"; print }如果设置了标记f,则取消设置,否则打印/,并始终打印记录。

处理字符串中出现/**/的情况。

答案 2 :(得分:0)

用于多字符RS的GNU awk:

$ awk -v RS='/[*]|[*]/' -v ORS= 'NR%2' file


%report1(email=first@email.com ,lag=3);

%report2(email=first@email.com  ,lag=3);