2017-09-05 67 views
2

我需要删除,(之间的多条线,包括图案以及第一次出现时的两条线。删除壳中两个图案之间的线

Test , 

this 

is the 
deletion 
part 
(
done... 

期望输出

Test 
done 

我已经尝试了以下使用sed来实现上述输出,但它只是返回整个文件数据。

sed 's/,*(//' file 

在此先感谢。

+0

请解释你的代码(你打算工作的方式,而不是它的工作方式),它似乎与你描述的目标非常无关,这使得问题变得模糊不清。 – Yunnosch

+0

@Yunnosch我提供了一个例子,说明我打算如何使用代码:) –

回答

2

awk更适合在这里:

awk '/,/{p=1; sub(/[ \t]*,.*/, ""); print} !p; /\(/{p=0}' file 

Test 
done 

另外,您还可以使用perl

perl -i -0777 -pe 's/\h*,.*\(//s' file 

或者这个表达式用否定字符类,不要求s修改:

perl -i -0777 -pe 's/\h*,[^(]*\(//' file 
+1

'[\ s \ S]'nice':-)' –

+1

其他选项是使用's'修饰符,如''s〜 (?s)。* \(~~'' – anubhava

+2

perl更经常使用修饰符以外的正则表达式/...// s' –

0

With sed:

sed '/Test/,/done/{//!d;s/ ,$//}' file 

/Test/,/done/:从线路匹配Test高达下一行匹配done

  • //!d删除除了匹配地址(Test ,done
  • s/ ,$//去除从第一发生,所有行地址
+1

介意解释你的代码是如何工作的? – bfontaine

+1

@bfontaine我添加了一些解释。 – SLePort

0

这可能为你工作(GNU SED):

sed -z 's/,[^(]*(//g' file 

啜食整个文件到内存和全局替换,(什么也没有之间的任何字符。

0
awk '{sub(/ ,|\.../,"")}NR==1;END{print}' file 

Test 
done 
+0

这不符合OP的要求 - 它应该从“,”中删除,直到“(”(也可以稍微解释一下它的工作原理!) – psmears