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

时间:2014-02-11 23:15:03

标签: linux bash awk

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

我尝试过以下操作,并简单地打印变量“$ source”:

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

例如,source包含:

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

我想得到:

<code>
<code>
<code>

3 个答案:

答案 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语句放在条件部分而不是操作部分中,因此它总是评估为true,因此始终会打印当前行。

您真正想要的是在脚本开头设置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的,可以在你所做的所有awk中移植:

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

答案 1 :(得分:1)

这是修复。

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

答案 2 :(得分:0)

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

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