比赛后如何打印所有内容?
我尝试了以下内容,它只是打印变量"$source":
awk "IGNORECASE = 1;f;/some_word</div>/{f=1}" <<< "$source"
例如,源包含:
<code>
<code>
MATCH
<code>
<code>
<code>
我想得到:
<code>
<code>
<code>
你很接近。请记住,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,因此将始终打印当前行。
你真正想要的是在脚本的开头设置忽略大小写:
BEGIN { IGNORECASE = 1 }
f { print $0 }
/some_word</div>/ { f=1 }
可以在原始的单行语法中简化为:
BEGIN{IGNORECASE = 1} f; /some_word</div>/ {f=1}
整个脚本是(使用单引号,而不是双引号以避免外壳引用/逃离地狱):
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"
这是修复程序。
awk "BEGIN{IGNORECASE=1}f;/some_word</div>/{f=1}" <<< "$source"
(虽然你在问题中提到了awk,但我最近不得不想办法做到这一点,所以这里是)perl替代方案:
cat file.txt | perl -n -i -e '$should_print = 1 if /MATCH/; print $_ if $should_print'