[已解决] 关于 awk 里 sub 的一个问题

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
cjxgm
帖子: 1952
注册时间: 2010-04-23 20:40
系统: Arch Linux
来自: 浙江·杭州
联系:

[已解决] 关于 awk 里 sub 的一个问题

#1

帖子 cjxgm » 2011-08-07 20:06

vim 里

代码: 全选

:s/[0-9]\([a-z]\)[0-9]/\1/
在 awk 里要怎么做?

我尝试了

代码: 全选

{
    str = "1212abcsdwer897897"
    sub(/[0-9]([a-z])[0-9]/, /\1/, str)
    print str
}
但是输出是“0”。
把“/\1/”改成“"\1"”,结果输出了相当于C语言里'\x01'的东西

要怎样才能把 ( ) 里匹配的字取出来?

[c]#!/bin/awk -f

# USAGE:
# scc file.s.cc [ options ]
#
# OPTIONS:
# -c clean. Delete file.h and file.cc generated from file.s.cc

BEGIN {
if (ARGC < 2) {
print "You must specify an scc file!"
exit 1
}

file_scc = ARGV[1]
if (file_scc !~ /\.s\.cc$/) {
print file_scc ": it is not an scc file!"
exit 2
}

file_cc = file_h = file_scc
sub(/\.s\.cc$/, ".cc", file_cc)
sub(/\.s\.cc$/, ".h", file_h )

if (ARGV[2] == "-c")
exit system("rm -f " file_cc " " file_h)

print "// cc generated by scc" > file_cc
print "#include \"" file_h "\"" >> file_cc
print "// h generated by scc" > file_h

stat = 0
}

{
if (stat == 0) { # Normal mode
if ($0 ~ /^extern:/) {
sub(/^extern:[[:blank:]]*/, "")
print $0 >> file_cc

sub(/[[:blank:]]*=[^,;"]+[[:blank:]]*/, "")
sub(/=?".*?"/, "")
sub(/\(.*?\)/, "")
print "extern " $0 >> file_h
}

else if ($0 ~ /^func:/) {
sub(/^func:[[:blank:]]*/, "")
print $0 >> file_h

sub(/[[:blank:]]*=[^,;"]+[[:blank:]]*/, "")
sub(/=?".*?"/, "")
print $0 >> file_cc
}

else if ($0 ~ /^[[:blank:]]*class/) {
print $0 >> file_h

class_name = $0
# TODO: Fixme
sub(/^.*?class[[:blank:]]+([a-zA-Z0-9_]+).*$/, /\1/, class_name)
print class_name # DEBUG
}

else
print $0 >> file_cc
}
}[/c](最后一个 else if 后面的 sub 句)
上次由 cjxgm 在 2011-08-09 11:15,总共编辑 1 次。
Clanjor Prods. | Develop for Developers. (C++, Lua) | 作曲编曲 | 实时渲染引擎
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 关于 awk 里 sub 的一个问题

#2

帖子 fnan » 2011-08-07 21:29

{
str = "1212abcsdwer897897"
sub(/[0-9]([a-z])[0-9]/, /\1/, str) #str里没有单独一个字母在两个数字中间,不会有结果。
print str
}
awk没有向后引用。
参考:
echo '1212abcsdwer897897'|awk '{if (match($0,/[0-9][a-z]+[0-9]/)) print substr($0,RSTART+1,RLENGTH-2)}'
abcsdwer
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
头像
cjxgm
帖子: 1952
注册时间: 2010-04-23 20:40
系统: Arch Linux
来自: 浙江·杭州
联系:

Re: 关于 awk 里 sub 的一个问题

#3

帖子 cjxgm » 2011-08-07 22:11

RSTART是神马,RLENGTH又是神马?
Clanjor Prods. | Develop for Developers. (C++, Lua) | 作曲编曲 | 实时渲染引擎
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 关于 awk 里 sub 的一个问题

#4

帖子 fnan » 2011-08-07 22:33

cjxgm 写了:RSTART是神马,RLENGTH又是神马?
awk内建变量,用match函数匹配后,RSTART是匹配字符串的开始位置,RLENGTH是字符串长度。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
头像
cjxgm
帖子: 1952
注册时间: 2010-04-23 20:40
系统: Arch Linux
来自: 浙江·杭州
联系:

Re: 关于 awk 里 sub 的一个问题

#5

帖子 cjxgm » 2011-08-08 17:56

解决了,用 gensub 即可。
Clanjor Prods. | Develop for Developers. (C++, Lua) | 作曲编曲 | 实时渲染引擎
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 关于 awk 里 sub 的一个问题

#6

帖子 fnan » 2011-08-08 22:49

第一次见到gensub函数。
kose5@kose5-Aspire-4552:~$ awk '{print gensub(/:.*$/,"\\1",1,$0)}' 1
awk: line 2: function gensub never defined
kose5@kose5-Aspire-4552:~$
:em06
难道不是标准装备?11.04上没有,10.04有,因为这原因基础教程上都没有?只用标准的,空欢喜了一阵。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
头像
cjxgm
帖子: 1952
注册时间: 2010-04-23 20:40
系统: Arch Linux
来自: 浙江·杭州
联系:

Re: 关于 awk 里 sub 的一个问题

#7

帖子 cjxgm » 2011-08-09 11:10

要用 gawk
Clanjor Prods. | Develop for Developers. (C++, Lua) | 作曲编曲 | 实时渲染引擎
MaskRay
帖子: 61
注册时间: 2010-04-29 22:00
系统: Gentoo Linux ~amd64
联系:

Re: 关于 awk 里 sub 的一个问题

#8

帖子 MaskRay » 2011-08-09 11:17

sub gsub 不支持捕获括号的引用
gensub 支持,但是算 gawk 的扩展
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: [已解决] 关于 awk 里 sub 的一个问题

#9

帖子 fnan » 2011-08-09 20:36

kose5@kose5-Aspire-4552:~$ gawk 'gensub(/(.*):.*/,"\\1",$5)}' 1
The program 'gawk' is currently not installed. You can install it by typing:
sudo apt-get install gawk
kose5@kose5-Aspire-4552:~$
:em06
awk里直接调用sed算了。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
回复