如何在比赛后打印所有内容?
我尝试过以下操作,并简单地打印变量“$ source”:
awk "IGNORECASE = 1;f;/some_word<\/div>/{f=1}" <<< "$source"
例如,source包含:
<code>
<code>
MATCH
<code>
<code>
<code>
我想得到:
<code>
<code>
<code>
答案 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'