下面有一个输入文本的文件(这不是原始文件,只是输入文本的示例),我想将所有的2个字母字符串替换为数字100。在这个文件FS中,除了将它们都视为FS之外,我别无选择:、\\或“”(空格),我希望将这些字段分隔符保留在输出中的原始位置(如在输入文件中)。
A:B C|D
AA:C EE G
BB|FF XX1 H
DD:MM:YY K我试过了
awk -F"[:| ]" '{gsub(/[A-Z]{2}/,"100");print}'但这似乎不起作用,请建议。
期望产出:
A:B C|D
100:C 1000 G
100|100 1001 H
100:100:100 K发布于 2017-01-30 15:18:28
POSIX awk中没有保留与RS (POSIX)定义的字符串或FS定义的regexp匹配的字符串的功能。因为在POSIX RS中只是一个字符串,所以不需要这样的功能,而且对于每个FS匹配字符串来说,这样做是不必要的,因为很少需要它。
在GNU awk中,RS可以是regexp,而不仅仅是字符串,您可以保留与RT匹配regexp RS的字符串,但是没有任何功能保留与FS匹配的值,因为POSIX没有这样做。相反,在GNU中,他们添加了一个第4 arg来拆分(),这样如果您想要的话,可以自己在数组中保留与FS匹配的字符串(seps[] ):
$ awk -v FS='[:| ]' '{
split($0,flds,FS,seps)
gsub(/[A-Z]{2}/,"100")
for (i=1;i<=NF;i++) {
printf "%s%s", $i, seps[i]
}
print ""
}' file
A:B C|D
100:C 100 G
100|100 1001 H
100:100:100 K在split()中查找GNU awk手册中的更多信息。
发布于 2017-01-30 13:07:50
在这种情况下
sed 's/[A-Z]\{2\}/100/g' YourFile
awk '{gsub(/[A-Z]{2}/, "100"); print}' YourFile在这种情况下不需要字段分隔,请用"100“更改所有上标字母组,除非在OP中指定其他约束(就像字符串中的其他元素一样,您需要指定可能和理想的内容,添加期望结果的示例为univoq)。
现在您肯定还有更多的事情要做,所以这段代码肯定会失败,因为使用ABC:DEF和100C:100F这样的代码是不可能的。
在这种情况下
awk -F '[[:blank:]:|]+' '
{
split( $0, aS, /[^[:blank:]:|]+/)
for( i=1;i<=NF;i++){
if( $i ~ /^[A-Z][A-Z]$/) $i = "100"
printf( "%s%s", $i, aS[i+1])
}
printf( "\n" )
} ' YourFile发布于 2017-01-30 13:08:12
试一试:
kent$ sed -r 's/(^|[:| ])[A-Z][A-Z]([:| ]|$)/\1100\2/g' file
A:B C|D
100:C 100 G
100|FF XX1 H
100:MM:100 K注意:
这将搜索和替换模式:在两个分隔符之间精确地设置了两个and。如果这不是您想要的,那么粘贴所需的输出。
https://stackoverflow.com/questions/41936382
复制相似问题