2016-08-01 50 views
1

awk单线程中有一种方法可以用不同的打印语句覆盖正面和负面的匹配案例吗?awk单线程覆盖匹配和非匹配CAS

举例说明。比方说,我有一个文件,我想用'#'预先输入一组单词,但仍想打印文件中的所有单词。

喜欢的东西:

awk '/red/||/green/ { print "# My mod : " $0 } else { print $0 }' 

当然,上述不会工作。但在awk中做到这一点的简单方法是什么?

干杯, 格特

回答

2

为了覆盖一般情况下,即在打印完全不同的东西,你可以使用next

awk '/red|green/ { print "foo"; next } { print "bar" }' file 

第二块,如果所述第一图案是假仅达到。

您也可以在单个操作块中使用if/else

针对您的特殊情况下,如果你只是增加了记录和打印,您可以使用此:

awk '/red|green/ { $0 = "# My mod : " $0 } 1' file 

1末确保每个打印记录。

1

如何 “痛苦” 长手

awk '{if (/red/||/green/) { print "# My mod : " $0 } else { print $0 }}' 

,对我;-)工作,但你可以节省一些字符打字

awk '{if (/red|green/) {print "# My mod : " $0 } else {print $0} }' 

OR

awk '{print ($0~/red|green/) ? "# My mod : $0 " : "" $0}' 

这是我能想到的最短的代码,可以实现您正在查找的结果。

+0

我承认@TomFenech的最短代码解决方案;-) 39个字符,而51 ;-)。祝你们好运。 – shellter

0
awk '{ print (/red|green/ ? "# My mod : " : "") $0 }' file