在“awk”搜索和替换中包含空格和制表符

在“awk”搜索和替换中包含空格和制表符

另一位用户早些时候帮助我修复了我使用 awk 所做的事情,我在所有文件中的任意位置搜索一个字符串,并在找到它时替换同一行中的两个数字。

awk -i inplace '/^gene_height/{ $3=sprintf("%.0f",(169+rand()*51));$5=sprintf("%.0f",(169+rand()*51)) }1' *

这在我制作的测试文件中有效(要读取的标签要少得多),但是在我尝试更改十字军之王 mod 的实际文件中,它被阻止了,因为配置文件中的每一行都以一个空格开头,然后是两个选项卡。我尝试删除gene_height之前的“^”并且这种方法有效,但它从文件中删除了空格和两个制表符,这可能会弄乱格式并破坏mod。

有谁知道如何让上面的脚本读取以空格、两个制表符开头、然后是字符串“gene_height”的文件,并在进行替换时保留空格和两个制表符?

答案1

要替换制表符、空格、垂直制表符,您可以使用[[:space:]].您还可以在“t”或“v”之前使用反斜杠来替换它们。

$ echo -e '\t' |cat -vet
^I$
$ echo -e 'x\tx x\vx' | awk '{gsub(/[[:space:]]/, "_"); print}'
x_x_x_x
$ echo -e 'x\tx x\vx' | awk '{gsub(/\t/, "_"); print}'
x_x x
     x
$ echo -e 'x\tx x\vx' | awk '{gsub(/ /, "_"); print}'
x   x_x
           x
$ echo -e 'x\tx x\vx' | awk '{gsub(/\v/, "_"); print}'
x   x x_x

相关内容