我想将匹配的模式转换为小写,我正在使用以下awk代码,但它正在替换,但在替换单词后添加换行符
awk 'BEGIN{ FS = "[&]";RS = ";"; };{ $2 = tolower($2) }{print $0}' test.txt
测试文件内容为:
This is test file & replacing ' PATTERN
我得到的输出是:
This is test file &
replacing '
PATTERN
答案 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 & replacing &APOS; PATTERN" | gawk -f ~/doit.awk
This is test file & replacing ' PATTERN
你可以放一个&#34; shebang&#34;如果你想能够运行这个独立的顶部。它可以在gawk或BSD awk中工作,所以它应该在大多数操作系统中都很开心。
答案 2 :(得分:0)
正如Ed Morton指出的那样,已经
您希望确保 OFS
和ORS
分别与FS
和RS
相同。
当您修改RS
时,Awk会更改其阅读行为;但除非您也更改ORS
,否则书写行为将保持默认状态,即将新行打印为记录分隔符。
正如Ed Morton指出的那样,您还需要将FS
更改为单个字符&
才能让您的程序正常运行。但是修复后,我得到了预期的输出。
vnix$ awk 'BEGIN{ OFS = FS = "&"; ORS = RS = ";"; };{ $2 = tolower($2) }{print $0}' <<':'
> This is test file & replacing &APOS; PATTERN
> :
This is test file & replacing ' PATTERN
&;
赞赏一个聪明的解决方案已经95%了。
答案 3 :(得分:0)
这对sed来说真的很重要:
$ sed -r 's/&[^;]+/\L&/g' file
This is test file & replacing ' 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 & replacing ' PATTERN