将匹配的模式转换为小写AWK

时间:2015-09-11 17:48:19

标签: awk ksh

我想将匹配的模式转换为小写,我正在使用以下awk代码,但它正在替换,但在替换单词后添加换行符

awk 'BEGIN{ FS = "[&]";RS = ";";  };{ $2 = tolower($2) }{print $0}' test.txt

测试文件内容为:

This is test file & replacing ' PATTERN

我得到的输出是:

    This is test file & 
    replacing ' 
    PATTERN

4 个答案:

答案 0 :(得分:1)

或许这更符合您的需求

awk '{for(i=1;i<=NF;i++) if("&"==substr($i,1,1)) $i=tolower($i)}1'

将以&符号开头的所有单词转换为小写。

或者,如果要为匹配指定第一个和最后一个字符

 awk '{for(i=1;i<=NF;i++) if(match($i,"&.*;")) $i=tolower($i)}1'

˚F

答案 1 :(得分:1)

我没有看到一个简单的单行程来实现这一目标。也许是一个简短的脚本:

{
  while (match($0, /&[A-Z]+;/)) {
    tag=substr($0,match($0,/&[A-Z]+;/)+1); tag=substr(tag,0,index(tag,";"));
    $0=substr($0,0,match($0,/&[A-Z]+;/)) tolower(tag) substr($0,match($0,/&[A-Z]+;/)+length(tag)+1);
  }
}

1

这会逐步搜索输入大写标签的每一行输入,并且对于找到的每一行,使用一组substr()函数替换该行。

测试:

$ echo "This is test file &AMP;   replacing &APOS; PATTERN" | gawk -f ~/doit.awk
This is test file &amp;   replacing &apos; PATTERN

你可以放一个&#34; shebang&#34;如果你想能够运行这个独立的顶部。它可以在gawk或BSD awk中工作,所以它应该在大多数操作系统中都很开心。

答案 2 :(得分:0)

正如Ed Morton指出的那样,已经

您希望确保OFSORS分别与FSRS相同。

当您修改RS时,Awk会更改其阅读行为;但除非您也更改ORS,否则书写行为将保持默认状态,即将新行打印为记录分隔符。

正如Ed Morton指出的那样,您还需要将FS更改为单个字符&才能让您的程序正常运行。但是修复后,我得到了预期的输出。

vnix$ awk 'BEGIN{ OFS = FS = "&"; ORS = RS = ";"; };{ $2 = tolower($2) }{print $0}' <<':'
> This is test file &AMP; replacing &APOS; PATTERN
> :    
This is test file &amp; replacing &apos; PATTERN
&;

赞赏一个聪明的解决方案已经95%了。

答案 3 :(得分:0)

这对sed来说真的很重要:

$ sed -r 's/&[^;]+/\L&/g' file
This is test file &amp; replacing &apos; PATTERN

如果它必须是便携式的,那么它就是:

$ awk '{rec=""; while(match($0,/&[^;]+/)) { rec = rec substr($0,1,RSTART-1) tolower(substr($0,RSTART,RLENGTH)); $0=substr($0,RSTART+RLENGTH)} print rec $0}' file
This is test file &amp; replacing &apos; PATTERN