簡體   English   中英

AWK 中的忽略大小寫

[英]ignorecase in AWK

以下命令按預期工作。

# 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 命令的開頭,如下所示:

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

以下行執行 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

希望這可以幫助。

塞巴斯蒂安。

對於那些擁有IGNORECASE標志無用的awk的人:

選項1

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

選項 2 (感謝@mwfearnley)

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

這有點晚了,但是這個問題的兩個答案(包括已接受的答案)提到執行awk 'IGNORECASE=1;...' - 即把IGNORECASE=1作為條件,而不是塊中的語句。

不應該這樣做。 它確實按預期設置了變量,但它也(意外地)將其評估為布爾表達式,返回 true。

沒有塊的真條件將導致始終打印該行。 如果它碰巧與以下模式匹配,它也會被打印第二次。

接受的答案可能意味着awk '{IGNORECASE=1} ...' ,它在每行文本上設置IGNORECASE變量。 這可以通過使用BEGIN條件僅分配一次來進一步改進。 但更簡潔的解決方案是使用-v標志在腳本邏輯之外設置參數:

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

請注意, IGNORECASE特定於 gawk。 對於非 gawk 特定的方法, GNU Awk 用戶指南建議在模式匹配中使用tolower

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM