[英]How can I replace a specific character in a file where it's position changes in bash command line or script?
我有以下文件:
2020-01-27 19:43:57.00 厘米 -8.5 0.2 0 4 81 -2.9 000 0 0 00020 043857.82219 3 1 1 1 1 1
我需要更改的字符“3”是粗体和斜体。 此字符的值是动态的,但始终是一位数。 我已经使用 sed 尝试了一些东西,但由于在该位置之前添加了额外的字符,我无法想出一种方法来解释字符改变位置。
该字符始终位于行尾的相同位置,但不是从行首开始。 意思是,这个字符左边的内容可能会改变,它可能会更长,但这总是第 11 个字符和从末尾开始的第 6 个数字。 很容易设计一种方法来切割它,或者用尾巴找到它,但我无法设计一种方法来替换它。
需要明确的是,有问题的单个数字字符将始终替换为另一个单个数字字符。
使用 GNU awk
$ cat file
2020-01-27 19:43:57.00 C M -8.5 0.2 0 4 81 -2.9 000 0 0 00020 043857.82219 3 1 1 1 1 1
$ gawk -i inplace -v new=9 'NF {$(NF-5) = new} 1' file
$ cat file
2020-01-27 19:43:57.00 C M -8.5 0.2 0 4 81 -2.9 000 0 0 00020 043857.82219 9 1 1 1 1 1
在哪里:
NF {$(NF-5) = new}
表示,当该行不为空时,用新值 (9) 替换倒数第 6 个字段。1
表示打印每条记录。awk '{ $(NF-5) = ($(NF - 5) + 8) % 10; print }'
给定您的输入数据,它会产生;
2020-01-27 19:43:57.00 C M -8.5 0.2 0 4 81 -2.9 000 0 0 00020 043857.82219 1 1 1 1 1 1
3 已经通过 11 到 1 映射——根据你如何分配新值来选择你的毒药,但魔术是$(NF - 5)
在最后一列之前(或从末尾开始第六列$(NF - 5)
选择第五列。
我会假设您要查找的数字与末尾的距离相同,无论它之前是什么:
rev ~/test.txt | awk '$6=<value to replace>' | rev
你会尝试以下方法吗:
replace="x" # or whatever you want to replace
sed 's/\(.\)\(.\{10\}\)$/'"$replace"'\2/' file
\\(.\\)\\(.\\{10\\}\\)$
匹配一个字符,后跟十个字符,然后锚定在行尾。使用 bash shell 这应该是最后一个选项。
rep=10
read -ra var <<< '2020-01-27 19:43:57.00 C M -8.5 0.2 0 4 81 -2.9 000 0 0 00020 043857.82219 3 1 1 1 1 1'
for i in "${!var[@]}"; do printf '%s ' "${var[$i]/${var[-6]}/$rep}"; done
如果它在一个文件中。
rep=10
read -ra var < file.txt
for i in "${!var[@]}"; do printf '%s ' "${var[$i]/${var[-6]}/$rep}"; done
不是最短和最快的方法,但可以做到......
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.