2014-02-11 39 views
1

如何在比赛结束后打印所有内容?如何在比赛结束后打印所有内容?

我试过以下,它简单打印变量 “$源”:

awk "IGNORECASE = 1;f;/some_word<\/div>/{f=1}" <<< "$source" 

例如,来源包含:

<code> 
<code> 
MATCH 
<code> 
<code> 
<code> 

我想获得:

<code> 
<code> 
<code> 
+0

给出$ source的详细信息,是否需要打印匹配行? – BMW

+0

$源代码是一个html代码。我不需要比赛线。 – Orlo

+0

你想在比赛之后或比赛之后的一切事情包括比赛或文件中的所有内容或包含比赛或其他内容的文件后面的文件中的所有内容?发布一些示例输入和预期输出。 –

回答

2

你就近了。请记住,awk脚本具有以下语法:

<condition> { <action> } 

默认条件为true并且打印当前记录的默认操作。当你写:

IGNORECASE = 1;f;/some_word<\/div>/{f=1} 

是一样的:

IGNORECASE = 1 
f 
/some_word<\/div>/ { f=1 } 

当你默认的操作添加是一样的:你已经把

IGNORECASE = 1 { print $0 } 
f { print $0 } 
/some_word<\/div>/ { f=1 } 

公告IGNORECASE = 1语句在一个条件部分而不是一个动作部分,所以它总是评估为真,所以总是会打印当前行。

你真正想要的是什么在脚本的开头设置IGNORECASE:

BEGIN { IGNORECASE = 1 } 
f { print $0 } 
/some_word<\/div>/ { f=1 } 

您也可以在原有的一个行语法减少到这一点:

BEGIN{IGNORECASE = 1} f; /some_word<\/div>/ {f=1} 

和整个脚本是(使用单引号,而不是双引号来避免shell引用/转义地狱):

awk 'BEGIN{IGNORECASE = 1} f; /some_word<\/div>/ {f=1}' <<< "$source" 

但注意,IGNORECASE是GNU的awk的具体,可以移植在所有awks你会怎么做:

awk 'f; tolower($0) ~ /some_word<\/div>/ {f=1}' <<< "$source" 
1

这是修复程序。

awk "BEGIN{IGNORECASE=1}f;/some_word<\/div>/{f=1}" <<< "$source" 
+0

我需要awk忽略区分大小写匹配 – Orlo

+0

好吧,我更新了命令,再试一次。 – BMW

0

(虽然你在问题中提到的awk,我最近不得不想出一个办法做到这一点,所以在这里是)perl的替代品:

cat file.txt | perl -n -i -e '$should_print = 1 if /MATCH/; print $_ if $should_print' 
+0

'$ print = 1 if/MATCH /;打印$ _ if $ print'。好悲伤。知道perl的人告诉我可以在perl中写出清晰易读的脚本 - 为什么地球上没有人这样做? –

+0

上面的代码转化为如下代码:第0行:if(/ MATCH /){$ print = 1;}和第1行if($ print){print $ _;)'。起初可能有点棘手,但你过一会儿就会习惯。 – user2599522

+0

所以你命名变量'print',就像命令名?这当然不利于清晰!我认为你正在打印一些东西('print'),然后测试/ MATCH /('1 if/MATCH /'),然后什么都不做,然后再打印一个测试('$ _ if') 。不能将perl脚本写成像在C或其他常用语言中以及在您的注释伪代码中看到的那样简单的“if(condition)do something”语句? –