【问题标题】:ignorecase in AWKAWK 中的忽略大小写
【发布时间】:2011-03-08 05:55:15
【问题描述】:

以下命令按预期工作。

# some command | awk '/(\<^create\>|\<^alter\>|\<^drop\>)/,/;/' 
create table todel1 (id int) max_rows=2
/*!*/;
alter table todel1 engine=InnoDB
/*!*/;
create database common
/*!*/;
create database rules
/*!*/;

但它只匹配小写“create”、“alter”等。我想在 awk 语句中使用 IGNORECASE 开关,以便返回搜索词的所有实例。

【问题讨论】:

  • 已接受答案中的示例错误地将 IGNORECASE = 1 评估为条件(具有副作用),而不是块中的语句。这个条件是真实的,并且会导致每一行被打印至少一次。

标签: awk


【解决方案1】:

IGNORECASE = 1; 添加到 awk 命令的开头,如下所示:

bash-3.2$ echo "Create" | awk '/^create/;'
bash-3.2$ echo "Create" | awk 'IGNORECASE = 1;/^create/;'
Create

【讨论】:

  • BEGIN块或命令行中设置它,因为它不需要为每一行输入执行。
  • 请注意,这是gawkism。对于丹尼斯的第二点,他的意思是:awk '/bunch of regex here/' IGNORECASE=1
  • 这至少在 awk 版本 20070501 中不起作用。 echo "No match" | awk 'IGNORECASE = 1;/^create/;'No match。如果除了正则表达式之外还有其他内容,它似乎不会添加隐式 if 语句。
  • 正如@ceykooo 所说,这对我也不起作用。但这对我有用:echo "No match" | awk 'tolower($0) ~ /^create/'
  • 将它设置在 BEGIN 块或任何块中,否则它不能正常工作。当它不在 { } 块中时,所有文本行都在 gawk 3.1.6 和 4.1.1 中匹配,并且可能是普遍匹配的。 I.E. echo -e "a\nb\nc" | awk '忽略 = 1; /B/' - 输出包含 a、b、b、c 的四行! echo -e "a\nb\nc" | awk 'BEGIN { IGNORECASE = 1 } /B/' - 只输出包含 b 的一行。
【解决方案2】:

以下行执行 OR 测试而不是 AND :

echo -e "Create\nAny text" | awk 'IGNORECASE = 1;/^create/;'
Create
Create
Any text

BEGIN 特殊词解决了问题:

echo -e "Create\nAny text" | awk 'BEGIN{IGNORECASE = 1}/^create/;'
Create

希望这会有所帮助。

塞巴斯蒂安。

【讨论】:

  • 与其说是 OR 测试,不如说它只是计算两个表达式(其中一个总是计算为真),因此将每个输入行打印一次或两次。
【解决方案3】:

对于那些 旧的 awk 的人,IGNORECASE 标志是无用的:

选项 1

echo "CreAte" | awk '/^[Cc][Rr][Ee][Aa][Tt][Ee]/'

选项 2(感谢 @mwfearnley)

echo "CreAte" | awk 'tolower($0) ~ /^create/'

【讨论】:

【解决方案4】:

这有点晚了,但是twoanswers 对这个问题(包括接受的答案)提到了做awk 'IGNORECASE=1;...' - 即将IGNORECASE=1 作为一个条件,而不是块中的语句。

不应该这样做。它确实按预期设置了变量,但它也(如意外)将其评估为布尔表达式,返回 true。

没有块的真实条件将导致该行始终被打印。如果它恰好匹配下面的模式,它也会被第二次打印出来。

接受的答案可能意味着awk '{IGNORECASE=1} ...',它在每一行文本上设置IGNORECASE 变量。这可以通过使用BEGIN 条件仅分配一次来进一步改进。但更简洁的解决方案是使用-v 标志在脚本逻辑之外设置参数:

awk -v IGNORECASE=1 '/(\<^create\>|\<^alter\>|\<^drop\>)/, /;/'

请注意,IGNORECASE 特定于 gawk。对于非 gawk 特定的方法,GNU Awk User's Guide 建议在模式匹配中使用tolower

awk '(tolower($0) ~ /(\<^create\>|\<^alter\>|\<^drop\>)/), /;/'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-15
    • 2014-02-08
    • 2021-05-18
    相关资源
    最近更新 更多