我想在第11栏中更改这些字符
!"#$%&'()*+,-.\/0123456789:;<=>?@ABCDEFGHIJ
对于这些行为者:
@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghi
所以,如果我在第11列000@!
中,它应该是PPP_@
。我试过awk
:
awk '{a = gensub(/[@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghi]/, /[!\"\#$%&'\''()*+,-.\/0123456789:;<=>?@ABCDEFGHIJ]/, "g", $11); print a }' file.txt
但它不起作用......
答案 0 :(得分:3)
尝试Perl。
perl -lane '$F[10] =~ y/!"#$%&'"'"'()*+,-.\/0-9:;<=>?@A-J/@A-Z[\\]^_`a-i/;
print join(" ", @F)'
我在&#34;第11栏&#34;你的意思是在第十次连续空格之后的几个字符的字符串,这是-a
选项默认分割的内容(基本上是为了模拟Awk)。遗憾的是,对数组@F
的更改不会直接显示在输出中,因此您必须从(修改的)@F
重建输出行,这会将字段分隔符规范化为单个空格
答案 1 :(得分:2)
只需将f = 2
更改为f = 11
:
$ cat tst.awk
BEGIN {
f = 2
old = "!\"#$%&'()*+,-.\\/0123456789:;<=>?@ABCDEFGHIJ"
new = "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghi"
n = length(old)
for (i=1; i<=n; i++) {
map[substr(old,i,1)] = substr(new,i,1)
}
}
{
n = length($f)
newStr = ""
for (i=1; i<=n; i++) {
oldChar = substr($f,i,1)
newStr = newStr (oldChar in map ? map[oldChar] : oldChar)
}
$f = newStr
print
}
$ cat file
a 000@! b
$ awk -f tst.awk file
a PPP_@ b
请注意,您必须在字符串中转义"
和\
。